从没有索引的非常大的数据库中删除行

问题描述 投票:0回答:1

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

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

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

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

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

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

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

sql sql-server sql-server-2008 indexing sql-delete
1个回答
0
投票

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

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

*我不明白的是:

  1. 如何触发 SQL Server 触发器来复制 4 年的数据?
  2. 为什么要复制最新的 4 年?

将超过 4 年的任何内容从源表复制到存档表可能会更好,在这种情况下,上面引用的 SQL Server 作业会将超过

X
年的任何内容从源表复制到存档表,并且然后从源表中删除该数据。您还需要确定将数据在存档表中保留多长时间。但您没有在问题中提供这些要求。

© www.soinside.com 2019 - 2024. All rights reserved.