为什么更好的隔离级别意味着 SQL Server 更好的性能

2024-04-04

在测量查询性能时,我发现隔离级别和运行时间之间存在依赖关系,这让我感到惊讶

READUNCOMMITTED - 409024
READCOMMITTED - 368021
REPEATABLEREAD - 358019
SERIALIZABLE - 348019

左列是表提示,右列是以微秒为单位的经过时间 (sys.dm_exec_query_stats.total_elapsed_time)。为什么更好的隔离级别可以提供更好的性能?这是一台开发机器,不会发生任何并发情况。由于锁定开销较少,我预计 READUNCOMMITTED 会被禁食。

更新:我确实测量了这个

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE  

已发出,Profiler 确认没有发生缓存命中。


首先,您需要在每个隔离级别下重复运行查询并对结果进行平均,丢弃时间最长的查询。这将消除缓冲区预热的影响:您希望所有运行都在热缓存上,而不是让一个查询预热缓存并付出比较代价。

接下来,您需要确保在现实的并发场景下进行测量。如果您将在现实生活中发生更新/插入/删除,那么您必须将它们添加到您的测试中,因为它们会影响极大地各种隔离级别下的读取。您最不想看到的就是得出“可序列化读取速度最快,让我们在任何地方使用它们”的结论,然后看着系统在生产中崩溃,因为一切都已序列化。

除此之外,唯一更快的隔离级别是脏读,因为它不获取锁。读取提交的快照(您没有测量)也不会获取锁,但由于行版本控制开销,它确实会影响整体性能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么更好的隔离级别意味着 SQL Server 更好的性能 的相关文章

随机推荐