【发布时间】:2023-03-09 09:07:01
【问题描述】:
我正在测试一些要添加到视图内的表中的非聚集索引(具有 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.
检查 A 和 C 行,我在 A 中阅读了将近 300 页,而在 B 中仅阅读了 32 页。那么为什么这个查询更快呢?我一直认为查询读取的页面越多,性能越差
【问题讨论】:
-
我不确定 62 毫秒是否特别重要,290 次读取也不是。在这种情况下,我认为时间差异可能取决于许多因素。您进行了多少次比较?这是一个公平的测试,没有同时运行其他查询吗? 397 毫秒的总运行时间真的足够长到需要研究优化吗?
-
@GarethD 我运行了 20 次,逻辑读取次数更多的选项在所有这些选项中都更快。我同意我的表并没有那么大而且尝试优化它的速度并不慢,但是当我看到更多读取但经过的时间更少时,我开始思考查询中的逻辑读取量有多重要。当我伤心时,我想无论如何,如果我有更多的页面要阅读,我的查询需要更长的时间来运行
-
也许页面大小不同,有或没有索引...
-
页面总是 8KB
标签: sql-server indexing query-optimization non-clustered-index logical-reads