【问题标题】:Why my SQL query is reading more pages but is faster?为什么我的 SQL 查询正在读取更多页面但速度更快?
【发布时间】: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.

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

【问题讨论】:

  • 我不确定 62 毫秒是否特别重要,290 次读取也不是。在这种情况下,我认为时间差异可能取决于许多因素。您进行了多少次比较?这是一个公平的测试,没有同时运行其他查询吗? 397 毫秒的总运行时间真的足够长到需要研究优化吗?
  • @GarethD 我运行了 20 次,逻辑读取次数更多的选项在所有这些选项中都更快。我同意我的表并没有那么大而且尝试优化它的速度并不慢,但是当我看到更多读取但经过的时间更少时,我开始思考查询中的逻辑读取量有多重要。当我伤心时,我想无论如何,如果我有更多的页面要阅读,我的查询需要更长的时间来运行
  • 也许页面大小不同,有或没有索引...
  • 页面总是 8KB

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多