sub-select makes query take too long - unusable

Поиск
Список
Период
Сортировка
От Mark Dueck
Тема sub-select makes query take too long - unusable
Дата
Msg-id 4B08C0F3.2040305@dueck.bz
обсуждение исходный текст
Ответ на Timestamp index not used in some cases  (Евгений Василев<evasilev@jarcomputers.com>)
Список pgsql-performance
Hi all,
The query below is fairly fast if the commented sub-select  is
commented, but once I included that column, it takes over 10 minutes to
return results.  Can someone shed some light on it?  I was able to redo
the query using left joins instead, and it only marginally increased
result time.  This is an application (Quasar by Linux Canada) I can't
change the query in, so want to see if there's a way to tune the
database for it to perform faster.  Application developer says that
Sybase is able to run this same query with the price column included
with only marginal increase in time.


select item.item_id,item_plu.number,item.description,
(select dept.name from dept where dept.dept_id = item.dept_id)
-- ,(select price from item_price
--    where item_price.item_id = item.item_id
--    and item_price.zone_id = 'OUsEaRcAA3jQrg42WHUm8A'
--    and item_price.price_type = 0
--    and item_price.size_name = item.sell_size)
from item join item_plu on item.item_id = item_plu.item_id and
item_plu.seq_num = 0
where item.inactive_on is null and exists (select item_num.number from
item_num
where item_num.item_id = item.item_id)
and exists (select stocked from item_store where stocked = 'Y'
and item_store.item_id = item.item_id)


Explain analyze without price column:
                                                                 QUERY PLAN

--------------------------------------------------------------------------------------------------------------------------------------------
 Hash Semi Join  (cost=1563.82..13922.00 rows=10659 width=102) (actual
time=165.988..386.737 rows=10669 loops=1)
   Hash Cond: (item.item_id = item_store.item_id)
   ->  Hash Join  (cost=1164.70..2530.78 rows=10659 width=148) (actual
time=129.804..222.008 rows=10669 loops=1)
         Hash Cond: (item.item_id = item_plu.item_id)
         ->  Hash Join  (cost=626.65..1792.86 rows=10661 width=93)
(actual time=92.930..149.267 rows=10669 loops=1)
               Hash Cond: (item.item_id = item_num.item_id)
               ->  Seq Scan on item  (cost=0.00..882.67 rows=10665
width=70) (actual time=0.006..17.706 rows=10669 loops=1)
                     Filter: (inactive_on IS NULL)
               ->  Hash  (cost=493.39..493.39 rows=10661 width=23)
(actual time=92.872..92.872 rows=10672 loops=1)
                     ->  HashAggregate  (cost=386.78..493.39 rows=10661
width=23) (actual time=59.193..75.303 rows=10672 loops=1)
                           ->  Seq Scan on item_num  (cost=0.00..339.22
rows=19022 width=23) (actual time=0.007..26.013 rows=19040 loops=1)
         ->  Hash  (cost=404.76..404.76 rows=10663 width=55) (actual
time=36.835..36.835 rows=10672 loops=1)
               ->  Seq Scan on item_plu  (cost=0.00..404.76 rows=10663
width=55) (actual time=0.010..18.609 rows=10672 loops=1)
                     Filter: (seq_num = 0)
   ->  Hash  (cost=265.56..265.56 rows=10685 width=23) (actual
time=36.123..36.123 rows=10672 loops=1)
         ->  Seq Scan on item_store  (cost=0.00..265.56 rows=10685
width=23) (actual time=0.015..17.959 rows=10672 loops=1)
               Filter: (stocked = 'Y'::bpchar)
   SubPlan 1
     ->  Seq Scan on dept  (cost=0.00..1.01 rows=1 width=32) (actual
time=0.002..0.004 rows=1 loops=10669)
           Filter: (dept_id = $0)
 Total runtime: 401.560 ms
(21 rows)


Explain with price column:
                                                                  QUERY PLAN

-----------------------------------------------------------------------------------------------------------------------------------------------
 Hash Semi Join  (cost=1563.82..4525876.70 rows=10659 width=106) (actual
time=171.186..20863.887 rows=10669 loops=1)
   Hash Cond: (item.item_id = item_store.item_id)
   ->  Hash Join  (cost=1164.70..2530.78 rows=10659 width=152) (actual
time=130.025..236.528 rows=10669 loops=1)
         Hash Cond: (item.item_id = item_plu.item_id)
         ->  Hash Join  (cost=626.65..1792.86 rows=10661 width=97)
(actual time=92.780..158.514 rows=10669 loops=1)
               Hash Cond: (item.item_id = item_num.item_id)
               ->  Seq Scan on item  (cost=0.00..882.67 rows=10665
width=74) (actual time=0.008..18.836 rows=10669 loops=1)
                     Filter: (inactive_on IS NULL)
               ->  Hash  (cost=493.39..493.39 rows=10661 width=23)
(actual time=92.727..92.727 rows=10672 loops=1)
                     ->  HashAggregate  (cost=386.78..493.39 rows=10661
width=23) (actual time=59.064..75.243 rows=10672 loops=1)
                           ->  Seq Scan on item_num  (cost=0.00..339.22
rows=19022 width=23) (actual time=0.009..26.287 rows=19040 loops=1)
         ->  Hash  (cost=404.76..404.76 rows=10663 width=55) (actual
time=37.206..37.206 rows=10672 loops=1)
               ->  Seq Scan on item_plu  (cost=0.00..404.76 rows=10663
width=55) (actual time=0.011..18.823 rows=10672 loops=1)
                     Filter: (seq_num = 0)
   ->  Hash  (cost=265.56..265.56 rows=10685 width=23) (actual
time=36.395..36.395 rows=10672 loops=1)
         ->  Seq Scan on item_store  (cost=0.00..265.56 rows=10685
width=23) (actual time=0.015..18.120 rows=10672 loops=1)
               Filter: (stocked = 'Y'::bpchar)
   SubPlan 1
     ->  Seq Scan on dept  (cost=0.00..1.01 rows=1 width=32) (actual
time=0.002..0.004 rows=1 loops=10669)
           Filter: (dept_id = $0)
   SubPlan 2
     ->  Seq Scan on item_price  (cost=0.00..423.30 rows=1 width=8)
(actual time=1.914..1.914 rows=0 loops=10669)
           Filter: ((item_id = $1) AND (zone_id =
'OUsEaRcAA3jQrg42WHUm8A'::bpchar) AND (price_type = 0) AND
((size_name)::text = ($2)::text))
 Total runtime: 20879.388 ms
(24 rows)



В списке pgsql-performance по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: Performance degrade running on multicore computer
Следующее
От: Mark Dueck
Дата:
Сообщение: sub-select makes query take too long - unusable