Chr*_*s J 7 sql-server-2008 locking
SQL Server 是否有任何简单的方法来获取有关给定查询在执行过程中取出多少(以及可能是什么类型)锁的指标?
基本原理...
我正在重写一个相当讨厌的存储过程,它大量使用游标。基于集合的解决方案是可能的,因此我得到了三个版本:原始版本、带有表变量的基于集合的版本和完全基于 CTE 的基于集合的版本。我正在为基于 CTE 的解决方案获得良好的指标,但由于 CTE 版本创建的查询的大小和复杂性,我对发布它持谨慎态度,直到我对它进行了尽可能多的尽职调查。
现在我意识到 SQL 取出的锁是它认为需要在给定时间点取出的锁,并且在加载的生产服务器上它的行为可能会有所不同,但我希望它能给我一种感觉它会表现。
目前我正在使用探查器并保持事务打开以便我可以运行sp_lock
,但想知道我是否遗漏了 SQL Server 2008 中的一个技巧。
或者,我试图说服自己分析器在插入表变量时返回大量读取是可以的(对于给定的值 Ok),但我没有说服自己。CTE 解决方案的读取次数是 table-var 版本的一半,而 table-var 版本的高读取计数似乎完全取决于插入。在持续时间方面,CTE 和表 var one 大致相同,执行时间比基于游标的方法快 150-200%。
具有直方图目标、事件计数器目标或分桶器目标的扩展事件。您可以从MSDN上的How to: Find the Objects That has the Most Locks Take On Them示例开始,该示例几乎提供了您想要的内容。您可以修改示例以获取锁定类型(示例“按原样”过滤掉 S 和 U 锁),您可以对其进行细化以过滤每个会话等。
话虽如此,我必须指出,通过计算获取的锁来进行性能调查是非常不寻常的。重点通常放在等待统计信息上,如等待和队列方法中所述。请参阅例如捕获单个操作的等待统计信息,了解如何再次使用扩展事件来捕获特定查询的相关信息。
另一方面,如果您从并发的角度关注锁(新的 CTE 会因锁定而产生更多争用吗?)那么我建议您调查部署快照隔离。