SQL Server 2005高效删除

时间:2010-01-04 20:58:10

标签: sql sql-server-2005 sql-delete

我的问题是我需要从表中删除大约60M条记录而不会导致与使用此表的其他进程发生死锁。此时,我几乎完成了使用while循环删除记录,该循环一次只处理大约1M条记录,但它是整天拍摄的。

Q1:从表中删除大量数据的最佳方法是什么,使表保持在线状态,并且对在MS SQL Server 2005中需要使用此表的其他资源的影响最小?

Q2:有没有办法像在Oracle中一样在SQL Server中实现单独的行锁定(而不是表锁定)? (注意回答这个问题可能会回答Q1)。

A2:所以@Remus Rusanu告诉我,有一种方法可以删除row level locking

3 个答案:

答案 0 :(得分:2)

看到这个thread,原始海报实际上做了一些测试并发布了最有效的方法。 MVP最初使用一个选项来实际插入您想要保留的数据到临时表中,然后截断原始表并重新插入。

答案 1 :(得分:1)

我最近做了类似的事情。我只创建了一个SQL Server作业,每10分钟运行一次,删除一百万行。代码如下

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
DELETE TOP 1000000 FROM BIG_TABLE WHERE CreatedDate <= '20080630'

所述表格中有大约900密耳的行开头。没有注意到任何重大的性能问题。

答案 2 :(得分:1)

最有效的方法是使用分区切换,请参阅Transferring Data Efficiently by Using Partition Switching。缺点是它需要提前规划分区的部署方式。

如果分区切换不可用,则答案取决于实际的表架构。您最好发布实际架构(包括所有索引,最重要的是聚类键定义)和符合删除候选项的条件。

至于Q2,自90年代中期以来,SQL Server已经进行了行级锁定,我不知道你究竟在问什么。