在PostgreSQL中,如果有这样的查询:
SELECT --
FROM --
WHERE --
GROUP BY --
HAVING
func1 AND func2;
我认为规划师可能有以下三种策略:
假设func1成本为c1,func2成本为c2,且c1> c2,func2首先对目标列表执行,生成较小的结果集,然后func1对较小的结果集执行
PostgreSQL实际使用哪种方法?
如果其中之一func
是非集合且非VOLATILE
表达式,则计划者可以有效地将其移至WHERE
子句。
否则,(func1 AND func2)
将作为单个过滤器表达式应用于结果组。此时,执行者的懒惰布尔评估规则开始生效;如果第一个条件的计算结果为false
,则不会费心执行第二个条件。因此,该行为最接近您的第二个或第三个选项,但是在结果集的一次传递中执行。
评估的顺序取决于计划者,因此从理论上讲,它可以决定首先执行func2
。但是,我不确定是什么会触发这种行为。即使func1
耗资10亿,它似乎仍然倾向于从左到右的评估。
该EXPLAIN ANALYSE
输出会告诉你在哪里执行计划,应用这些条件,并通过添加一些RAISE NOTICE
语句的功能的身体,你可以观察到的函数调用的确切顺序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句