优化删除大量行(超过数百万行)-SQL Server 2005
首先,我们从ProductFileLocalName获得最大id,然后是-1000(因为我们不想删除最近添加的内容,因为它们可能尚未插入ProductFileInfo中) 然后,我们将max id传递到此存储过程:优化删除大量行(超过数百万行)-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)
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这是一个差异表,另一个表我使用了你的建议,它工作得很好。