查询计划存储在视图和普通 SQL 的计划缓存中
从这里
行。
一劳永逸:它对我有什么帮助?
即使我有Query plans
查询cache
:一旦我运行查询,他将扫描整个表/秒+聚合+....。
如果我明天运行它-它将再次扫描整个表/秒+聚合....
不可能有这样的情况:“啊!!!我有数据在缓存中,所以我会从那里拿走它......(因为可能表已经改变......)
那么,真正的好处在哪里?
我似乎错过了什么。
谢谢你。
查询计划存储在视图和普通 SQL 的计划缓存中
从这里
行。
一劳永逸:它对我有什么帮助?
即使我有Query plans
查询cache
:一旦我运行查询,他将扫描整个表/秒+聚合+....。
如果我明天运行它-它将再次扫描整个表/秒+聚合....
不可能有这样的情况:“啊!!!我有数据在缓存中,所以我会从那里拿走它......(因为可能表已经改变......)
那么,真正的好处在哪里?
我似乎错过了什么。
谢谢你。
假设我们有一个查询,例如
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开始,您可能会发现对了解更多关于查询计划的方法和原因有用的资源。
答案是查询计划被缓存以防止每次编译查询计划的成本。第二次运行查询(或另一个可以使用相同计划的查询)时,它不需要重新运行编译过程,它只是从缓存中提取计划。
简而言之,执行计划是对如何完成查询的解释,而不是查询中涉及的实际数据(因此,当您重新运行查询时,可以一遍又一遍地应用执行计划)。
打个比方,执行计划类似于食谱——它是获取数据/制作餐点的方法,而不是数据/餐点本身。
改进之处在于数据库引擎需要时间来制定查询的执行计划,因此如果它被缓存,则下次运行相同查询时不需要该开销。
当您向 SQL 提交查询时,它会通过一些步骤来显示结果。主要的有解析器、algebrizer 和查询优化器。
查询优化器负责构建执行计划,或者从缓存中选择一个执行计划,据我所知,构建计划的过程非常昂贵,所以如果你可以重用它会更好。
要点是 exec 计划不包含数据本身,只是从 BD 检索数据的一种方式。因此,一旦“定义”了计划,它就会被传递到存储引擎并用于检索数据。