缓存查询计划?

时间:2012-04-04 16:11:49

标签: sql-server sql-server-2008 sql-execution-plan

  

查询计划存储在计划缓存中,用于视图和普通视图   SQL

来自here

确定。

一劳永逸: 对我有何帮助?

即使我在Query plans中有cache查询:一次我运行查询,他将扫描整个表格/ s +聚合+。 ......。

如果我明天运行它 - 将再次扫描整个表格/ s +聚合 ....

不可能出现这样的情况:“啊!!!我在缓存中有数据,所以我从那里拿走它...... ...(因为表格可能有改变...)

那么,真正的好处在哪里?

我似乎错过了什么。

谢谢。

4 个答案:

答案 0 :(得分:3)

假设我们有一个查询,例如

SELECT *
FROM 
    A 
    INNER JOIN B ON -- omitted
    INNER JOIN C ON -- omitted
    -- omitted
    INNER JOIN Q ON -- omitted

有很多表。显然,执行这些连接的顺序将影响性能。此外,在给定表统计信息的情况下,确定最佳顺序也会花费一些时间。

通过缓存查询计划,我们可以支付决定最佳订单的成本只需一次 - 每次运行查询时,我们都知道先采取K,将其加入E,然后加入H,依此类推。

当然,这意味着数据统计数据的重大变化会使我们的计划无效,但缓存任何内容总是需要权衡。


您可能会发现有助于更多地了解查询计划的方法和资源的资源是SQL Coach - 从THE Analogy开始。

答案 1 :(得分:2)

答案是缓存查询计划以防止每次编译查询计划的成本。第二次运行查询(或另一个可以使用相同计划的查询)时,不必再为重新运行编译过程付费,它只是从缓存中提取计划。

答案 2 :(得分:1)

简单地说,执行计划是对查询将如何完成的解释,而不是查询中涉及的实际数据(因此,当您重新运行查询时,可以反复应用执行计划)。 / p>

一个类比就是说执行计划与食谱类似 - 它是获取数据/制作餐食的方法,而不是数据/餐食本身。

改进之处在于数据库引擎需要时间来计算查询的执行计划,因此如果缓存它,则下次运行相同的查询时不需要开销。

答案 3 :(得分:0)

当您向SQL提交查询时,它会执行一些步骤来显示结果。主要是解析,algebrizer和查询优化器。

查询优化器负责构建执行计划,或者从缓存中选择一个执行计划,据我所知,构建计划的过程非常昂贵,因此如果您可以重用它,则更好。

主要观点是exec计划本身不包含数据,只是从BD中检索数据的方式。因此,一旦计划被“定义”,它就会被传递到存储引擎并用于检索数据。