【发布时间】:2021-10-05 15:59:41
【问题描述】:
现在我有一张表,其中有大量重复项需要删除(大约 5 亿)。
我有一个查询将删除所有重复项,但由于事务日志已填满,它无法完成整个查询。
将非重复项移动到新表,然后重命名它会起作用,但在这种情况下,我无法这样做。这将在生产环境中执行,因此我无法删除该 d1 表。
与涉及更改某种备份事务日志设置的其他解决方案相同。
这是我的查询:
;WITH CTE AS
(
SELECT
d_id, d_record, d_d2id,
ROW_NUMBER() OVER (PARTITION BY d_record, d_d2id ORDER BY d_id) RowNumber
FROM
d1
WHERE
d_d2id >= 25 AND d_d2id <= 28
)
DELETE FROM CTE
WHERE RowNumber > 1
显然这会起作用,但是由于必须执行的删除量,它会炸毁事务日志。
有没有办法创建这个特定的 CTE,然后分批检查 1000 条记录并以这种方式删除它们,从而留下一大堆事务而不是 1 个?还是有另一种方法可以做到这一点?我唯一的解决方案是遍历这些重复项并删除它们,而不会破坏事务日志。
谢谢!
【问题讨论】:
-
有没有办法在 SQL Server 中关闭事务日志?您当前的查询(至少)看起来已经非常理想了。
-
您可以添加另一个 CTE 术语,它只过滤掉 RowNumber > 1,然后在所有剩余的行上添加另一个 row_number,然后只删除每个批次/提交的前 N 个。冲洗,重复直到完成。一些数据库支持某种形式的 FETCH FIRST N ROWS,可以用来代替第二个 row_number 表达式。
-
用您正在使用的数据库标记您的问题。据我所知,鉴于您的非标准代码仅适用于一个数据库,您的“显然这将起作用”是完全不正确的。
标签: sql duplicates sql-delete