所以我有一个相当大的表(1.5亿行),每晚运行数据清理查询。现在这些查询不会更新大量记录,但是为了获得所需的记录,必须在子查询中多次查询该单个表,这需要一些时间。
那么,对我来说做一个正常的更新语句会更好吗,或者如果我把我需要的几个结果放在一个临时表中会更好,然后只是为这几行做了更新,这会很大在更新期间减少锁定。
我不确定在大部分时间用于查询时更新语句是如何锁定的。如果它只更新5条记录,并运行一半和一小时,它会释放一条记录,它在第一分钟更新,还是等到查询结束?
由于
答案 0 :(得分:1)
您需要使用(并查看)ROWLOCK
表提示。您可以将其与更新语句一起使用,同时批量更新5000行。这将尝试在目标表中放置行锁(或者如果存在覆盖索引,则放在索引键上)。如果由于某种原因失败,锁将升级为表锁。
From MSDN(关于可能发生锁定升级的原因):
当数据库引擎每1250年检查一次可能的升级时 新获得的锁,当且仅当一个锁时,才会发生锁升级 Transact-SQL语句在单个上获得了至少5000个锁 表的参考。 Transact-SQL时会触发锁定升级 声明在a的单个引用上获取至少5,000个锁 表。例如,如果声明,则不会触发锁定升级 在一个索引中获取3,000个锁,在另一个索引中获取3,000个锁 同桌。同样,如果a,则不会触发锁定升级 语句在表上有自联接,并且每个引用都对表进行 表中只获得了3,000把锁。
实际上,在上一篇文章中还有更多内容。您应该看看混合锁定类型升级部分。