【问题标题】:how to delete multiple records from mssql from million records如何从百万条记录中删除mssql中的多条记录
【发布时间】:2023-01-07 00:47:15
【问题描述】:

我在一张表中有 9 亿行。如何在条件超过 1000 天的情况下每次删除行。

我正在使用以下查询:

delete
FROM db.dbo.table
WHERE [DateIn] <= DATEADD(DAY, -1000, GETDATE());

它应该删除超过 1000 天,但每次删除都不符合我的预期。

【问题讨论】:

  • 删除 1 条缺失记录是什么意思?你是说它没有删除 1 行,所以 999 行,而不是 1,000 行?
  • 该逻辑不会删除 1,000 行,它会删除 DateIn 超过 1,000 天前的所有行。从今天开始,那将是 2020 年 4 月 11 日。我觉得这不是你想要做的。
  • 我改写了你的问题,希望它更有意义。你能解释一下为什么删除没有按照你想要的那样工作吗?以上将删除所有DateIn 的值小于 1,000 天前的行;所以对于今天,DateIn 是在 2020 年 4 月 11 日或之前{该查询运行的时间}。
  • 作为旁注,您确实需要升级您的实例。 SQL Server 2008 已经完全地自 2019 年年中以来不受支持;它没有任何安全更新超过 3.5 年。它已知存在安全漏洞,并且在支持结束后这么长时间继续使用它可以被认为是非常不负责任的。
  • 我怀疑“lack”最初是“lakh”,表示 100,000。我认为 OP 想要删除超过 1,000 天的任何内容,但一次将其分成 100,000 行的多个事务

标签: sql-server sql-server-2008


【解决方案1】:

考虑首先备份(总是备份)到另一个表或以其他方式删除恢复是非常昂贵的。免责声明:我没有测试这些和这只是一个超级快速的帖子.始终在对生产数据执行任何操作之前进行测试。

这应该可以解决问题,但您可以考虑使用更小的块大小。这在您的情况下可能会或可能不会表现良好;

WHILE EXISTS (SELECT * FROM db.dbo.table WHERE [DateIn] <= DATEADD(DAY, -1000, CURRENT_TIMESTAMP))
BEGIN
BEGIN TRANSACTION
DELETE TOP (100000)
FROM db.dbo.table
WHERE [DateIn] <= DATEADD(DAY, -1000, CURRENT_TIMESTAMP)
COMMIT TRANSACTION
END

CTE 示例(可能考虑更小的删除)这具有从最早日期开始工作的优势;

WHILE EXISTS (SELECT * FROM db.dbo.table WHERE [DateIn] <= DATEADD(DAY, -1000, CURRENT_TIMESTAMP))
BEGIN
BEGIN TRANSACTION
;WITH deleteCTE AS (
    SELECT TOP (100000) *
    FROM db.dbo.table
    WHERE [DateIn] <= DATEADD(DAY, -1000, CURRENT_TIMESTAMP)
    ORDER BY [DateIn] ASC)
DELETE FROM deleteCTE;
COMMIT TRANSACTION
END

考虑替代方案,例如创建一个包含一组 ID 的表,使用日期/组的某种“组指示符”删除,并通过连接遍历该表;像这样的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    相关资源
    最近更新 更多