JOIN vs SubQuery:为什么子查询性能在不应该获胜的情况下获胜?

时间:2019-07-12 12:51:54

标签: postgresql performance subquery left-join

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相同的时间?

0 个答案:

没有答案