7

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

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

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

更新:我确实用

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE  

发出并且 Profiler 确认没有发生缓存命中。

4

2 回答 2

5

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

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

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

于 2010-03-15T22:15:16.160 回答
0

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

我仍然有兴趣阅读对此的深入了解。

于 2012-01-25T23:33:22.410 回答