【问题标题】:Delete few entries from a table SQL Server从表 SQL Server 中删除几个条目
【发布时间】:2013-02-22 12:59:33
【问题描述】:

我的一张表中有 42,715,078 个条目,我想删除 TOP 42,715,000 行(我只想保留 78 个条目)。

有谁知道我可以这样做吗?

PS:我不想删除表,只想删除表中的条目。

【问题讨论】:

标签: sql-server sql-server-2012


【解决方案1】:

您最好的选择可能是选择要保留到临时表中的 78 行,然后截断该表并将它们重新插入。

SELECT * INTO #temp FROM TableName WHERE <Condition that gets you the 78 rows you want>

或者如果您没有特定的 78 行

SELECT TOP 78 * INTO #temp FROM TableName

然后

TRUNCATE TABLE TableName

最后但并非最不重要的一点

INSERT INTO TableName
    SELECT * FROM #temp

根据您用于获取 78 行的条件,这样做应该会快得多,并且您可以避免日志膨胀,因为 TRUNCATE 只记录了最少的日志。

【讨论】:

  • 其实我没看到。我想我需要在回答之前更好地阅读 cmets :)。
【解决方案2】:

我们有一个每月截断一次的活动日志。 (我们保留每月备份,因此如果需要,我们可以恢复任何旧数据。)如果您的表每个月都在增长,并且您希望像我们对我们的表一样保持较小,您可以设置 SQL 代理作业每个月运行一次。

我们一次只删除 5000 行以保持数据库的负载,因此该作业每两分钟运行一个小时。这给了它足够的时间来删除所有最旧的行而不锁定数据库。

DECLARE @LastDate DateTime  -- We remove the oldest rows by month
DECLARE @NumberOfRows INT   -- Number of rows to keep

-- Set the Date to the current date minus 3 months.
SET @LastDate = DATEADD(MM, -3, GETDATE())

-- Since it runs on the first Saturday of each month, this code gets it
   back to the first of the monh.
SET @LastDate = CAST(CAST(DATEPART(YYYY, @LastDate) AS varchar) + '-' + CAST(DATEPART(MM, @LastDate) AS varchar) + '-01' AS DATETIME)

-- We use 5000.
SET @NumberOfRows = 5000 

DELETE TOP (@NumberOfRows) FROM MyTable WHERE Created < @LastDate 

【讨论】:

    【解决方案3】:

    我明白了。

    DELETE TOP (42715000) 
    FROM <tablename>
    WHERE <condition>
    

    效果很好!

    【讨论】:

    • TOP 在这种情况下是未定义的。无法保证将删除 42715000 行。
    • 您可能会破坏事务日志。删除是完全逐行记录的,因此您有 4200 万多个日志条目...
    • 正如马丁所说,这里没有保证。那件上衣真的应该有订单。
    • @Bridge - DELETE TOP 不支持 ORDER BY 您需要使用带有 TOP ... ORDER BY 的 CTE 或派生表并从中删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    • 2013-04-03
    • 2022-06-29
    • 2023-03-04
    • 2013-06-27
    相关资源
    最近更新 更多