优化删除大量行(超过数百万行)-SQL Server 2005

优化删除大量行(超过数百万行)-SQL Server 2005,sql,Sql,首先,我们从ProductFileLocalName获得最大id,然后是-1000(因为我们不想删除最近添加的内容,因为它们可能尚未插入ProductFileInfo中) 然后,我们将max id传递到此存储过程: DELETE TOP (10000) FROM ProductFileLocalName WITH (ROWLOCK) FROM ProductFileLocalName LEFT OUTER JOIN ProductFileInfo AS pfi WITH (NOLOCK)

首先,我们从ProductFileLocalName获得最大id,然后是-1000(因为我们不想删除最近添加的内容,因为它们可能尚未插入ProductFileInfo中)

然后,我们将max id传递到此存储过程:

DELETE TOP (10000)
FROM ProductFileLocalName WITH (ROWLOCK)
FROM ProductFileLocalName
    LEFT OUTER JOIN ProductFileInfo AS pfi WITH (NOLOCK) ON ProductFileLocalName.ProductFileLocalNameId = pfi.ProductFileLocalNameId
WHERE (ProductFileLocalName.ProductFileLocalNameId < @maxid AND pfi.ProductFileInfoId IS NULL);
删除顶部(10000)
来自ProductFileLocalName和(ROWLOCK)
来自ProductFileLocalName
左外部将ProductFileInfo作为pfi与ProductFileLocalName.ProductFileLocalNameId=pfi.ProductFileLocalNameId上的(NOLOCK)连接
其中(ProductFileLocalName.ProductFileLocalNameId<@maxid,pfi.ProductFileInfoId为空);

这是执行此操作最有效的方法吗?

如果你真的只保留了百万分之1000的数据,你有没有选择将你想要保留的数据复制到一个双表(相同的SCHEMA)中,然后核取大的数据并复制回那个小的子集?。您需要测量此选项的计时,并检查您能够承受的连续延迟时间

另一种选择是找出一个可以用作分区列的列—假设这些百万条记录在较长的时间段内出现,您可能可以设置安全的时间限制,并始终遵循较旧的分区(或多个分区),甚至可以先分离它们


正如其他人提到的,如果你想让人们思考更具体的场景而不是猜测,那么你需要在问题中加入更多的具体信息——没有一种策略可以用于所有的大删除。

请告诉我们你到底想做什么?这是你关于批量删除的第三个问题(它是数十亿,现在是数百万,现在是前10000,…)表的百分比,你要删除多少记录?@gbn这是一个差异表,另一个表我使用了你的建议,它工作得很好。