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

当在我的查询中测量性能时,我想出了隔离级别和流逝时间之间的依赖关系,这对我来说是令人惊讶的

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

左列是表提示,右列是经过时间(以微秒为单位)(sys.dm_exec_query_stats.total_elapsed_time)。 为什么更好的隔离级别提供更好的性 这是一个开发机器,不会发生任何并发。 由于减少了锁定开销,我期望READUNCOMMITTED成为禁食。

更新:我确实用这个来衡量

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE  

并且Profiler证实没有发生缓存命中。


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

接下来,您需要确保在实际并发场景下进行测量。 如果您将在现实生活中发生更新/插入/删除操作,那么您必须将它们添加到您的测试中,因为它们会在各种隔离级别下极大地影响读取。 最后你想要得出的结论是'可序列化的读取速度最快,可以在任何地方使用它们',然后在生产中观察系统融化,因为所有内容都是序列化的。

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


现在我更好地理解隔离级别,我发现更好的隔离级别可以实现一些智能优化。 例如,一旦事务读取一些数据隔离级别可能会规定它应该使用该数据直到最后,而不是尝试从磁盘重新读取它们。

我仍然有兴趣阅读一些这方面的深入了解。

链接地址: http://www.djcxy.com/p/45207.html

上一篇: Why better isolation level means better performance in SQL Server

下一篇: Build a Visual Studio Project without access to referenced dlls