提问人:Pablo Iglesias 提问时间:10/17/2023 最后编辑:Pablo Iglesias 更新时间:10/18/2023 访问量:66
从没有索引的超大型数据库中删除行
Deleting rows from a very large database with no index
问:
我们从硬件团队那里收到一条消息,告诉我们仅数据库就占用了 1.4 TB 的空间。我们看了一下它,它有几个表,里面有数百万个历史数据条目(触发器每天都会出于某种原因加载过去 4 年的日志,并且根本不删除数据)。而且它没有索引。
我们想删除旧数据,但我们无法弄清楚如果不熔化机器,一个简单的 COUNT 需要 15 分钟,添加索引或尝试做任何大的事情都会失败。
我们现在唯一想到的想法是创建一个临时表,小批量存储我们想要保存的数据,然后截断旧表。
到目前为止,我们正在尝试将此代码的 select 部分作为测试。
WITH CTE AS
(
SELECT TOP (1000) *
FROM table
ORDER BY year DESC
)
DELETE FROM CTE
选择值需要更长的时间,以我们正在查看的数据量,我们预计在 7 年多的时间里清理表格。
编辑:问题是如何清除无用的数据。桌子占用这么多空间是一个问题 编辑2:将术语更改为临时表。澄清一下:创建一个新表来转储我们想要保留的信息。然后,删除它。
答:
0赞
HardCode
10/18/2023
#1
如果您不关心此存档表中超过 4 年的数据(在您的问题中不清楚),那么:
- 禁用触发器。
- 编写表的 CREATE TABLE 语句的脚本。
- 删除表。
- 重新创建表。
- 启用触发器。在它触发*并重新加载 4 年的数据后......
- 禁用触发器。将触发器更改为仅加载昨天的数据。
- 创建 SQL Server 作业以从存档表中删除超过 4 年(或所需的任何年数)的数据。
*我不明白的是:
- 如何触发 SQL Server 触发器以复制 4 年的数据?
- 你为什么要复制最近的 4 年?
最好将超过 4 年的任何内容从源表复制到存档表,在这种情况下,上面引用的 SQL Server 作业会将任何超过年份的数据从源表复制到存档表,然后从源表中删除该数据。您还需要确定将数据保留在存档表中多长时间。但是您没有在问题中提供这些要求。X
评论
0赞
Pablo Iglesias
10/18/2023
触发器是每天 8:00 的 rutine 自己开火。没有人知道为什么我们需要保存这么多重复数据,它已经使用了很多年了,我们实际上使用适当的日志进行检查。请注意,这是一个由几家公司牵头的项目,他们每个人都用自己的制作方式将数据库聚集在一起。
0赞
Pablo Iglesias
10/18/2023
我忘了。这个表(我们称之为 2)从中获取数据,就像你说的那样:加载日志,过滤 4 年,删除超过 4 年的数据。1 只是 2 的副本,但不会每天删除数据......我觉得大声说出来很愚蠢。你是对的,我没有提供这些要求,因为我们没有这些要求,我们应该提供这些要求。我要向经理解释这一点,看看我是否克服了他对破坏某些东西的可能性的恐惧。
0赞
HardCode
10/18/2023
为了减轻经理的恐惧,您还可以建议为存档创建一个新的第三个表,其中包含适当的有限数据。然后,当经理对表 3 工作正常感到满意时,DROP Table 2。是的,它更多的是短期存储使用,但它提供了安心。
0赞
Pablo Iglesias
10/21/2023
我设法让他删除了表的数据,但他拒绝触摸触发器的代码或表的结构,因为这不是我们的代码。关于这个问题,我想到了“不是我的工作”,但无论如何都要感谢,因为这是一个好主意。
评论
CLUSTERED INDEX