我的一张表中有 42,715,078 个条目,我想删除 TOP 42,715,000 行(我只想保留 78 个条目)。
有谁知道我可以这样做吗?
PS:我不想删除表,只想删除表的条目。
我的一张表中有 42,715,078 个条目,我想删除 TOP 42,715,000 行(我只想保留 78 个条目)。
有谁知道我可以这样做吗?
PS:我不想删除表,只想删除表的条目。
最好的选择可能是选择要保留到临时表中的 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 只记录了最少的日志。
我们有一个活动日志,我们每月截断一次。(我们保留每月备份,因此如果需要,我们可以恢复任何旧数据。)如果您的表每个月都在增长,并且您希望像我们对我们的表一样保持较小,您可以设置 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
我得到了它。
DELETE TOP (42715000)
FROM <tablename>
WHERE <condition>
效果很好!