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

Ole*_*lin 7 sql-server optimization isolation-level

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

READUNCOMMITTED - 409024
READCOMMITTED - 368021
REPEATABLEREAD - 358019
SERIALIZABLE - 348019
Run Code Online (Sandbox Code Playgroud)

左列是表提示,右列是经过的时间(以微秒为单位)(sys.dm_exec_query_stats.total_elapsed_time).为什么更好的隔离级别可以提供更好 这是一台开发机器,无论发生什么都没有并发.由于锁定开销较少,我希望READUNCOMMITTED能够被禁止.

更新:我测量了这个

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE  
Run Code Online (Sandbox Code Playgroud)

发布和Profiler确认没有缓存命中发生.

Rem*_*anu 5

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

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

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