1

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

在创建索引之前,我运行了查询并获得了 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.

创建非聚集索引后,我得到了这个:

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.

检查行AC ,我在A中读取了近 300 页,而在B中仅读取了 32页。那么为什么这个查询更快呢?我一直认为查询读取的页面越多,性能越差

4

1 回答 1

0

简短的回答是“因为这两个查询使用不同的执行计划”。为什么在您的情况下,更多的读取会导致更快的执行 - 如果没有两个执行计划(当然我不是指来自 SSMS 的屏幕截图),无论我们多么努力地打磨我们的水晶球,这是不可能回答的。

如果你喜欢这类事情,你必须首先阅读大量关于如何阅读执行计划的文档,然后再添加几本由 Kalen Delaney 和 Itzik Ben-Gan 等人写的书在解释这个和那个的最低层次的复杂性时,经常会竭尽全力。

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

于 2014-12-02T01:31:24.060 回答