在我的查询中测量性能时,我想出了隔离级别和经过时间之间的依赖关系,这对我来说是令人惊讶的
READUNCOMMITTED - 409024 READCOMMITTED - 368021 REPEATABLEREAD - 358019 SERIALIZABLE - 348019
左列是表提示,右列是经过的时间,以微秒为单位(sys.dm_exec_query_stats.total_elapsed_time).为什么更好的隔离级别可以提供更好这是一台开发机器,无论发生什么都没有并发.由于锁定开销较少,我希望READUNCOMMITTED能够被禁止.
更新:我测量了这个
DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE
已发布和Profiler确认没有缓存命中发生.
解决方法
首先,您需要在每个隔离级别下重复运行查询并平均结果,丢弃具有最大时间的查询.这将消除缓冲区预热影响:您希望所有运行都在热缓存上,没有一个查询加热缓存并支付相应的惩罚.
接下来,您需要确保在真实并发场景下进行测量.如果您将在现实生活中进行更新/插入/删除,则必须将它们添加到测试中,因为它们会在各种隔离级别下极大地影响读取.你想要的最后一件事是得出结论’可序列化的读取是最快的,让我们在任何地方使用它们’,然后观察系统在生产中融化,因为一切都是序列化的.
除此之外,唯一合法更快的隔离级别是脏读,因为它不会获取锁.读取已提交的快照(您未测量)也不会获取锁定,但由于行版本控制开销,它确实会影响整体性能.