我的一张表中有42,715,078个条目,我想删除TOP 42,715,000行(我想保留78个条目)。
任何人都知道我能做到这一点?
PS:我不想删除表,只想删除表的条目。答案 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>
效果很好!