【问题标题】:Why does it take so long to calculate an Execution Plan?为什么计算一个执行计划需要这么长时间?
【发布时间】:2018-12-09 05:59:32
【问题描述】:

我有一个问题,当我第一次运行查询(选择查询)时,某些表的重建或更新统计信息完成后,它运行得太慢,此查询的持续时间约为 30 分钟,但在那之后当我再次运行它时,持续时间约为 3 秒,如何解决?

我在查询中设置了统计 IO 并得到了这个结果:

--第二次

表'table1'。扫描计数 42,逻辑读取 963118,物理读取 0, 预读读取 274,lob 逻辑读取 0,lob 物理读取 0,lob 预读为 0。

--第一次

表'table1'。扫描计数 42,逻辑读取 977019,物理读取 1143,预读读取 946797,lob 逻辑读取 0,lob 物理读取 0,lob预读为0。

【问题讨论】:

  • 30 分钟对于这个计划来说有点极端,所以很有可能它实际上是在选择一个次优的计划,但直到第二次才知道。可能有一个尚未更新的表?查询中的索引提示可能会有所帮助,或者添加一个稍微不同的索引。但是,我们需要更多信息才能分辨。另外,这种情况会发生多长时间?

标签: sql-server statistics sql-execution-plan sqlperformance rebuild


【解决方案1】:

为什么计算一个执行计划需要这么长时间?

你认为它为什么要计算执行计划?

它从磁盘读取的“第一次”:read-ahead reads 946797

预读可能高达 512 字节,因此 30 分钟内的 946,797 次预读平均为 500 IO/秒高达 260MB/秒,任何一个都可能是尽可能多的 IO 系统可以提供。因此,这些预读可能会占整个 30 分钟的执行时间。

第二次数据几乎都在内存中了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 2011-12-07
    相关资源
    最近更新 更多