2010-07-31 54 views
0

首先,我们从ProductFileLocalName中获取最大ID,然后是 - 1000(因为我们不想删除最近的添加,因为它们可能不会在ProductFileInfo插入尚)优化删除大量行(超过几百万) - SQL Server 2005

然后我们通过最大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); 

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

+0

你能准确告诉我们你想要做什么吗?这是关于大规模删除的第三个问题(它是数十亿,现在是数百万,现在是TOP 10000,...) – gbn 2010-07-31 12:13:42

+0

表格的百分比明智,你删除了多少条记录? – NinjaCat 2010-07-31 12:54:16

+0

@gbn这是一个差异表,另一个表我使用了你的建议,它运行良好。 – RPS 2010-07-31 15:14:36

回答

0

如果你真的只保留1000万,你是否有选择将你想保留的东西复制到一个双表(相同的scehema),然后将大的副本复制并复制回那个小的子集? 。你需要测量这个选项的时间,并检查连续延迟时间可以承受多长时间。

另一种方法是找出可用作分区列的列 - 假设这些百万条记录在某个较长的时间段内进入,您可能可以建立安全的时间限制并始终在较早的分区(或分区),甚至首先将它们分开。

正如其他人所提到的,如果您希望人们思考更多特定场景而不是猜测,那么您需要将更多具体信息放入问题中 - 对于所有大的删除都没有单一的策略。