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

Sql server 为什么更好的隔离级别意味着SQL Server的性能更好,sql-server,optimization,isolation-level,Sql Server,Optimization,Isolation Level,在测量查询的性能时,我发现隔离级别和运行时间之间存在一种依赖关系,这让我感到惊讶 READUNCOMMITTED - 409024 READCOMMITTED - 368021 REPEATABLEREAD - 358019 SERIALIZABLE - 348019 左栏是表提示,右栏是以微秒为单位的已用时间(sys.dm\u exec\u query\u stats.total\u eassed\u time)。为什么更好的隔离级别可以提供更好的性能?这是一台开发机器,不会发生任何并发。我

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

READUNCOMMITTED - 409024
READCOMMITTED - 368021
REPEATABLEREAD - 358019
SERIALIZABLE - 348019
左栏是表提示,右栏是以微秒为单位的已用时间(sys.dm\u exec\u query\u stats.total\u eassed\u time)。为什么更好的隔离级别可以提供更好的性能?这是一台开发机器,不会发生任何并发。我希望READUNCOMMITTED是最快的,因为锁开销较少

最新消息:我确实用

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE  

已发布,探查器确认未发生缓存命中

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

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


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

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


我仍然有兴趣对此进行深入了解。

请查找我的问题的更新,以解决您回答中的一些问题。“脏读”是指READUNCOMMITTED,对吗?1)在冷缓存上运行查询是不准确的。您的生产查询将不会在冷缓存上运行,您将优化一个不切实际的场景,并且您不测量查询,而是测量磁盘读取吞吐量。您还需要测量热缓存上的性能,并跟踪两者(冷运行时间和热运行时间)。2) 脏读是未提交的读取。对于在正常情况下仅对特定数据运行一次的大型查询(数百万行),缓存的相关性如何?仍然非常相关。即使数据太大,无法放入内存,并且每次运行都必须重新读取表的每一页,仍然存在非叶页缓存(即表中的热页、根或近根)、较窄的非聚集索引缓存、表元数据缓存。不要认为在你的桌子上是ISAM文件。我无法理解-ISAM文件不是也缓存在RAM中吗?我当然有这样的习惯,谢谢你的提醒。雷姆斯提供了相当有价值的意见,尽管我仍然希望了解我观察到的现象发生的原因。