Postgresql plpgsqlsql是否支持where子句中的短路?

Postgresql plpgsqlsql是否支持where子句中的短路?,第1张

概述如果我有以下玩具查询 SELECT *FROM my_tablesWHERE my_id in ( SELECT my_other_id FROM my_other_tables) AND some_slow_func(arg) BETWEEN 1 AND 2; WHERE子句中的第一个条件是否会短路第二个具有复杂运行时间的条件? 我正在研究一些实际上是plpgsql中FOR 如果我有以下玩具查询
SELECT *FROM my_tablesWHERE my_ID in (    SELECT my_other_ID    FROM my_other_tables) AND some_slow_func(arg) BETWEEN 1 AND 2;

WHERE子句中的第一个条件是否会短路第二个具有复杂运行时间的条件?

我正在研究一些实际上是plpgsql中FOR LOOP的一部分的sql,我可以对my_other_tables中存在的所有记录进行迭代,然后使用some_slow_func()在FOR LOOP的范围内进行测试.但我很好奇是否支持sql,或者plpgsql支持短路.

有些研究:
我查看了Postgres的邮件列表,发现这说sql一般不支持短路:

http://www.postgresql.org/message-id/171423D4-9229-4D56-B06B-58D29BB50A77@yahoo.com

但其中一个回复表明订单可以通过子选择来强制执行.我不确定他在说什么.我知道子选择是什么,但我不确定如何强制执行命令?有人可以为我澄清一下吗?

如文档所述,WHERE子句中的评估顺序应该是不可预测的.

它与子查询不同.对于当前版本,驱动评估顺序的最简单和常用技术是在CTE中编写子查询.为了确保首先评估IN(…),您的代码可以写成:

WITH subquery AS(select * from my_tables  WHERE my_ID in (SELECT my_other_ID FROM my_other_tables))SELECT * FROM subquery  WHERE some_slow_func(arg) BETWEEN 1 AND 2;

您可能调整的其他内容是您的函数向优化器发出信号表示它很慢的成本.函数的默认开销是100,可以使用如下语句更改它:

ALTER FUNCTION funcname(argument types) cost N;

其中N是估计的每次呼叫成本,以任意单位表示,应与Planner Cost Constants进行比较.

总结

以上是内存溢出为你收集整理的Postgresql plpgsql / sql是否支持where子句中的短路?全部内容,希望文章能够帮你解决Postgresql plpgsql / sql是否支持where子句中的短路?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/1181166.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-02
下一篇2022-06-02

发表评论

登录后才能评论

评论列表(0条)

    保存