0

我手头的问题是我需要从表中删除大约 60M 记录,而不会导致与使用该表的其他进程发生死锁。在这一点上,我几乎已经使用 while 循环删除了记录,该循环一次只处理大约 1M 条记录,但是它需要一整天。

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

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

A2:正如@Remus Rusanu 告诉我的那样,有一种方法可以通过删除来进行行级锁定。

4

3 回答 3

2

看到这个帖子,原来的发帖人其实做了一些测试,贴出了最有效的方法。MVP 最初确实提供了一个选项,可以将您想要保留的数据实际插入到临时表中,然后截断原始表并重新插入。

于 2010-01-04T21:03:14.247 回答
1

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

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

所述表有大约 9 亿行开始。没有注意到任何重大的性能问题。

于 2010-01-04T21:07:17.267 回答
1

最有效的方法是使用分区切换,请参阅使用分区切换高效传输数据。缺点是它需要提前规划分区的部署方式。

如果分区切换不可用,那么答案取决于实际的表模式。您最好发布实际模式(包括所有索引,最重要的是聚集键定义)和符合删除候选者资格的标准。

至于第二季度,SQL Server 自 90 年代中期以来就具有行级锁定,我不知道您实际上在问什么。

于 2010-01-04T21:11:30.923 回答