从没有索引的超大型数据库中删除行

Deleting rows from a very large database with no index

提问人:Pablo Iglesias 提问时间:10/17/2023 最后编辑:Pablo Iglesias 更新时间:10/18/2023 访问量:66

问:

我们从硬件团队那里收到一条消息,告诉我们仅数据库就占用了 1.4 TB 的空间。我们看了一下它,它有几个表,里面有数百万个历史数据条目(触发器每天都会出于某种原因加载过去 4 年的日志,并且根本不删除数据)。而且它没有索引。

我们想删除旧数据,但我们无法弄清楚如果不熔化机器,一个简单的 COUNT 需要 15 分钟,添加索引或尝试做任何大的事情都会失败。

我们现在唯一想到的想法是创建一个临时表,小批量存储我们想要保存的数据,然后截断旧表。

到目前为止,我们正在尝试将此代码的 select 部分作为测试。

WITH CTE AS
(
SELECT TOP (1000) *
FROM table
ORDER BY year DESC
)
DELETE FROM CTE

选择值需要更长的时间,以我们正在查看的数据量,我们预计在 7 年多的时间里清理表格。

编辑:问题是如何清除无用的数据。桌子占用这么多空间是一个问题 编辑2:将术语更改为临时表。澄清一下:创建一个新表来转储我们想要保留的信息。然后,删除它。

sql-server sql-server-2008 sql-delete

评论

3赞 Dale K 10/17/2023
没有看到问题?
5赞 Thom A 10/17/2023
仅供参考,SQL Server 2008 在 4 年前完全不受支持。您就该实施升级计划了,大概是几年前就敲定的了。使用这样一个长期没有收到安全补丁的旧版本,会给您的环境和客户端带来重大风险。
2赞 siggemannen 10/17/2023
我认为你的想法很好:重命名旧表,使用旧名称创建新表,然后为要保存的数据创建索引,然后将数据从旧表复制到新表。您不需要聚簇索引,只需要一个年份索引或查找所需行所需的任何其他内容。即使数百万行也不需要那么长时间,您可以将其用于批量插入
5赞 Thom A 10/17/2023
“我们现在唯一想到的想法是创建一个时态表”你将无法创建临时表,该功能是在 SQL Server 2016 中添加的。虽然我不确定临时表在这里对你有什么帮助;您正在尝试减小表的大小,并且时态表不仅存储行的当前版本,还存储该行的所有历史版本。
3赞 Thom A 10/17/2023
你说你没有索引;这是否意味着你甚至没有?该表是否在堆中?CLUSTERED INDEX

答:

0赞 HardCode 10/18/2023 #1

如果您不关心此存档表中超过 4 年的数据(在您的问题中不清楚),那么:

  • 禁用触发器。
  • 编写表的 CREATE TABLE 语句的脚本。
  • 删除表。
  • 重新创建表。
  • 启用触发器。在它触发*并重新加载 4 年的数据后......
  • 禁用触发器。将触发器更改为仅加载昨天的数据。
  • 创建 SQL Server 作业以从存档表中删除超过 4 年(或所需的任何年数)的数据。

*我不明白的是:

  1. 如何触发 SQL Server 触发器以复制 4 年的数据?
  2. 你为什么要复制最近的 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
我设法让他删除了表的数据,但他拒绝触摸触发器的代码或表的结构,因为这不是我们的代码。关于这个问题,我想到了“不是我的工作”,但无论如何都要感谢,因为这是一个好主意。