gpt4 book ai didi

sql - Postgresql plpgsql/sql 是否支持 where 子句中的短路?

转载 作者:行者123 更新时间:2023-11-29 11:17:34 24 4
gpt4 key购买 nike

如果我有以下玩具查询

SELECT *
FROM my_tables
WHERE my_id in (
SELECT my_other_id
FROM my_other_tables
) AND some_slow_func(arg) BETWEEN 1 AND 2;

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

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

一些研究:我查看了 Postgres 邮件列表,发现 SQL 通常不支持短路:

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

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

最佳答案

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

它与子查询不同。对于早于版本 12 的 PostgreSQL,驱动评估顺序的最简单和常用的技术是在 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;

从 PostgreSQL 版本 12 开始,WITH 子查询可能会被优化器内联(有关所有详细信息,请参阅 doc page on WITH queries),并且只有在添加 时才能保证非内联MATERIALIZED 子句:

WITH subquery AS MATERIALIZED
(select * ... the rest is similar as above)

您可能需要调整的其他事项是您的函数向优化器发出其运行缓慢信号的成本。函数的默认成本是 100,可以使用如下语句更改它:

ALTER FUNCTION funcname(argument types) cost N;

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

关于sql - Postgresql plpgsql/sql 是否支持 where 子句中的短路?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14943475/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com