为什么我的SQL查询读取更多页面但速度更快?

时间:2014-12-01 18:02:40

标签: sql-server indexing query-optimization non-clustered-index logical-reads

我正在测试一些非集群索引,这些索引要添加到视图中的一个表中(它有7个内部联接)。 在运行Tunning Advisor(SQL Server 2008)之后,它向我展示了一个脚本,用于在表(a)中创建nonClsutered索引,这可以帮助我优化查询。

在创建索引之前,我运行了查询并获得了IO和TIME统计信息:

a) **Scan count 2, logical reads 420**
b) Scan count 2, logical reads 6
c) **Scan count 2, logical reads 40**
d) Scan count 3, logical reads 12
e) Scan count 4, logical reads 28
f) Scan count 4, logical reads 16
g) Scan count 2, logical reads 4
h) Scan count 1, logical reads 3
   CPU time = 172 ms,  elapsed time = 397 ms.

创建nonClustered索引后,我得到了这个:

a) **Scan count 16, logical reads 710**
b) Scan count 2, logical reads 6
c) **Scan count 2, logical reads 8**
d) Scan count 3, logical reads 12
e) Scan count 4, logical reads 28
f) Scan count 4, logical reads 16
g) Scan count 2, logical reads 4
h) Scan count 1, logical reads 3
   CPU time = 187 ms,  elapsed time = 335 ms.

检查 A C 行,我在 A 中读取了近300页, B中只读了32页即可。那么为什么这个查询更快?我一直认为查询读取的页面越多,执行的越差

1 个答案:

答案 0 :(得分:0)

简短的回答是"因为这两个查询使用不同的执行计划"。为什么更多的读取会导致您的案例执行速度更快 - 如果没有两个执行计划都不可能回答(当然,我不是指来自SSMS的屏幕截图),无论我们如何努力,水晶球。

如果您涉及到这类问题,首先需要阅读大量有关如何阅读执行计划的文档,然后再添加由Kalen Delaney和Itzik Ben-Gan等人撰写的几本书。在解释这个和那个的最低层错综复杂的过程中经常花费很大的精力。

或者您可以尝试将文本形式的计划附加到您的问题中,并希望1)某人能够指出观察到的行为的实际原因,并且2)您将能够理解解释。