在PostgreSQL中,如果我们有这样的查询:
SELECT --
FROM --
WHERE --
GROUP BY --
HAVING
func1 AND func2;
我认为计划者可能有三种策略:
假设func1成本c1,func2成本c2,c1> c2,func2首先在目标列表上执行,生成较小的结果集,然后func1对小结果集执行
哪一个是PostgreSQL中的实际方法?
答案 0 :(得分:3)
如果func
是非聚合和非VOLATILE
表达式,则规划者可以有效地将其移至WHERE
子句。
否则,(func1 AND func2)
将作为结果组的单个过滤器表达式应用。此时,遗嘱执行人的lazy boolean evaluation rules开始了;如果第一个条件评估为false
,则不会执行第二个条件。因此,行为最接近您的第二个或第三个选项,但只在结果集的一次传递中执行。
评估的顺序由计划者决定,因此从理论上讲,它可能决定先执行func2
。但是,我不确定是什么可能触发这种行为;即使func1
的成本为1000000000,它似乎仍然支持从左到右的评估。
EXPLAIN ANALYSE
输出将显示执行计划中应用这些条件的位置,并通过向函数体添加一些RAISE NOTICE
语句,您可以观察函数调用的确切顺序