通过临时表更新

时间:2014-08-04 20:35:33

标签: sql sql-server

所以我有一个相当大的表(1.5亿行),每晚运行数据清理查询。现在这些查询不会更新大量记录,但是为了获得所需的记录,必须在子查询中多次查询该单个表,这需要一些时间。

那么,对我来说做一个正常的更新语句会更好吗,或者如果我把我需要的几个结果放在一个临时表中会更好,然后只是为这几行做了更新,这会很大在更新期间减少锁定。

我不确定在大部分时间用于查询时更新语句是如何锁定的。如果它只更新5条记录,并运行一半和一小时,它会释放一条记录,它在第一分钟更新,还是等到查询结束?

由于

1 个答案:

答案 0 :(得分:1)

您需要使用(并查看)ROWLOCK表提示。您可以将其与更新语句一起使用,同时批量更新5000行。这将尝试在目标表中放置行锁(或者如果存在覆盖索引,则放在索引键上)。如果由于某种原因失败,锁将升级为表锁。

From MSDN(关于可能发生锁定升级的原因):

  

当数据库引擎每1250年检查一次可能的升级时   新获得的锁,当且仅当一个锁时,才会发生锁升级   Transact-SQL语句在单个上获得了至少5000个锁   表的参考。 Transact-SQL时会触发锁定升级   声明在a的单个引用上获取至少5,000个锁   表。例如,如果声明,则不会触发锁定升级   在一个索引中获取3,000个锁,在另一个索引中获取3,000个锁   同桌。同样,如果a,则不会触发锁定升级   语句在表上有自联接,并且每个引用都对表进行   表中只获得了3,000把锁。

实际上,在上一篇文章中还有更多内容。您应该看看混合锁定类型升级部分。

相关问题