我正在测试一些非集群索引,这些索引要添加到视图中的一个表中(它有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页即可。那么为什么这个查询更快?我一直认为查询读取的页面越多,执行的越差
答案 0 :(得分:0)
简短的回答是"因为这两个查询使用不同的执行计划"。为什么更多的读取会导致您的案例执行速度更快 - 如果没有两个执行计划都不可能回答(当然,我不是指来自SSMS的屏幕截图),无论我们如何努力,水晶球。
如果您涉及到这类问题,首先需要阅读大量有关如何阅读执行计划的文档,然后再添加由Kalen Delaney和Itzik Ben-Gan等人撰写的几本书。在解释这个和那个的最低层错综复杂的过程中经常花费很大的精力。
或者您可以尝试将文本形式的计划附加到您的问题中,并希望1)某人能够指出观察到的行为的实际原因,并且2)您将能够理解解释。