Recently我问过Why select from function is slow?
。
但是现在当我LEFT JOIN
使用此功能时,它需要11500ms。
当我用LEFT JOIN
重写SubQuery
时,只花了111毫秒
SELECT
(SELECT next_ots FROM order_total_suma( next_range ) next_ots
WHERE next_ots.order_id = ots.order_id AND next_ots.consumed_period @> (ots.o).billed_to
) AS next_suma, --<< this took only 111ms. See plan
ots.* FROM (
SELECT
tstzrange(
NULLIF( (ots.o).billed_to, 'infinity' ),
NULLIF( (ots.o).billed_to +p.interval, 'infinity' )
) as next_range,
ots.*
FROM order_total_suma() ots
LEFT JOIN period p ON p.id = (ots.o).period_id
) ots
--LEFT JOIN order_total_suma( next_range ) next_ots ON next_ots.order_id = 6154
-- AND next_ots.consumed_period @> (ots.o).billed_to --<< this is fine. plan is not posted
--LEFT JOIN order_total_suma( next_range ) next_ots ON next_ots.order_id = ots.order_id
-- AND next_ots.consumed_period @> (ots.o).billed_to --<< this takes 11500ms. See Plan
WHERE ots.order_id IN ( 6154, 10805 )
已附加plans
在谷歌搜索时我发现了this blog post
在大多数情况下,联接也是比子查询更好的解决方案 – Postgres甚至会在内部“重写”子查询,并在可能的情况下创建联接,但这当然会增加花费时间提出查询计划
许多类似this的问题
左[OUTER] JOIN可以比等效的子查询更快,因为服务器可能可以更好地对其进行优化-这是事实不仅限于MySQL Server。
那么为什么LEFT JOIN
的功能比SubQuery
慢得多?
有没有办法让LEFT JOIN
花费与SubQuery
相同的时间?