0

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

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

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

4

3 回答 3

6

最好的选择可能是选择要保留到临时表中的 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 只记录了最少的日志。

于 2013-02-22T13:14:28.167 回答
1

我们有一个活动日志,我们每月截断一次。(我们保留每月备份,因此如果需要,我们可以恢复任何旧数据。)如果您的表每个月都在增长,并且您希望像我们对我们的表一样保持较小,您可以设置 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 
于 2013-02-22T13:21:59.203 回答
0

我得到了它。

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

效果很好!

于 2013-02-22T13:06:18.250 回答