Jos*_*osh 9 performance merge large-data sql-server-2008 table-locking
我有一个非常大的数据集(约300万条记录),需要在每日时间表上与更新和新记录合并.我有一个存储过程实际上将记录集拆分为1000个记录块,并使用MERGE带临时表的命令,以避免在数据更新时锁定活动表.问题是它并没有完全帮助.该表仍然"锁定",我们使用数据的网站在尝试访问数据时会收到超时.我甚至尝试将其分成100个记录块,甚至试图WAITFOR DELAY '000:00:5'查看是否有助于在合并块之间暂停.它仍然相当缓慢.
我正在寻找有关如何在不锁定表的情况下合并大型数据集的任何建议,最佳实践或示例.
谢谢
在进行选择时,将前端更改为使用NOLOCK或READ UNCOMMITTED .
您不能NOLOCK MERGE,INSERT或UPDATE,因为必须锁定记录才能执行更新.但是,您可以NOLOCK SELECTS.
请注意,您应谨慎使用它.如果脏读是可以的,那就继续吧.但是,如果读取需要更新的数据,那么您需要沿着不同的路径前进,并弄清楚为什么合并3M记录会导致问题.
我愿意打赌,大部分时间都花在从合并命令期间从磁盘读取数据和/或在低内存情况下工作.简单地将更多ram填充到数据库服务器中可能会更好.
理想的数量是有足够的RAM来根据需要将整个数据库拉入内存.例如,如果您有一个4GB的数据库,那么请确保您在x64服务器中有8GB的RAM ..当然.
小智 5
我担心我会有相反的经历.我们正在执行更新和插入,其中源表只有一小部分行数作为目标表,其数量为数百万.
当我们在整个操作窗口中组合源表记录然后只执行一次MERGE时,我们看到性能提高了500%.我对此的解释是,您只需支付一次MERGE命令的前期分析,而不是在紧密循环中反复进行.
此外,我确信将160万行(源)合并到700万行(目标),而不是400行到700万行,超过4000个不同的操作(在我们的例子中),更好地利用了SQL服务器引擎的功能.同样,相当多的工作是分析两个数据集,这只进行一次.
我要问的另一个问题是,您是否知道MERGE命令在源表和目标表上的索引上执行得更好?我想推荐您以下链接:
http://msdn.microsoft.com/en-us/library/cc879317(v=SQL.100).aspx