从表SQL Server中删除几个条目

时间:2013-02-22 12:59:34

标签: sql-server sql-server-2012

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

任何人都知道我能做到这一点?

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

3 个答案:

答案 0 :(得分:5)

您最好的选择是选择要保留在临时表中的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只是最少记录。

答案 1 :(得分: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 

答案 2 :(得分:0)

我明白了。

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

效果很好!