gpt4 book ai didi

postgresql - 为什么不应用优化/使用不同的索引?

转载 作者:行者123 更新时间:2023-12-04 07:46:55 24 4
gpt4 key购买 nike

我有两个非常相似的查询:

WITH USAGE AS NOT MATERIALIZED ( SELECT
ocd.*,
1 AS conf_suma
FROM(
SELECT o, o.agreement_id AS agreement_id
FROM "order_bt" o
WHERE o.sys_period @> sys_time()
AND (o.app_period && tstzrange( '2021-01-01', '2021-02-01' ))
)ocd
)
SELECT
*,
(conf_suma/6) ::numeric( 10, 2 ) as group_nds,
(SELECT sum(conf_suma) from USAGE sq WHERE sq.agreement_id = agreement_id) as total_suma -- #1 SLOW
-- #2 FAST: (SELECT sum(conf_suma) from USAGE sq WHERE sq.agreement_id = 3385) as total_suma
FROM USAGE
WHERE agreement_id = 3385 -- LAST WHERE
它们的区别仅在于这一部分 sq.agreement_id = agreement_id VS sq.agreement_id = 3385他们的计划是 #1 slow#2 fast
#1 慢
enter image description here
#2 快
enter image description here
为什么在第一种情况下不应用优化?在我看来,优化器可以从 LAST WHERE 中看到只有一个 agreement_id .所以 agreement_id就像常数一样。如果我们把这个常数折叠成 slow子查询与 fast 相同子查询。这是规划者改进的地方吗?
附注。在我对生产的查询中,这导致查询运行 12 秒而不是 20 毫秒

最佳答案

感谢 RhodiumToad 在 IRC。错误在 agreement_id姓名。
必须写成 usage.agreement_id :

(SELECT sum(conf_suma) from USAGE sq WHERE sq.agreement_id = usage.agreement_id) as total_suma -- #1 NOW IT IS FAST TOO
现在 plan美好的。正如我所期望的:
enter image description here

关于postgresql - 为什么不应用优化/使用不同的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67166358/

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