0

查询计划存储在视图和普通 SQL 的计划缓存中

这里

行。

一劳永逸:它对我有什么帮助?

即使我有Query plans查询cache一旦我运行查询,他将扫描整个表/秒+聚合+....。

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

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

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

我似乎错过了什么。

谢谢你。

4

4 回答 4

3

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

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

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

通过缓存查询计划,我们只需支付一次决定最佳顺序的成本——每次后续运行查询时,我们已经知道首先将其加入,然后加入,等等。KEH

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


SQL Coach - 从THE Analogy开始,您可能会发现对了解更多关于查询计划的方法和原因有用的资源。

于 2012-04-04T16:28:05.347 回答
2

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

于 2012-04-04T16:26:38.793 回答
1

简而言之,执行计划是对如何完成查询的解释,而不是查询中涉及的实际数据(因此,当您重新运行查询时,可以一遍又一遍地应用执行计划)。

打个比方,执行计划类似于食谱——它是获取数据/制作餐点的方法,而不是数据/餐点本身。

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

于 2012-04-04T16:27:34.460 回答
0

当您向 SQL 提交查询时,它会通过一些步骤来显示结果。主要的有解析器、algebrizer 和查询优化器。

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

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

于 2012-04-04T16:30:49.773 回答