Postgresql:查询很慢(9.5)

时间:2017-07-31 04:11:23

标签: postgresql psql postgresql-9.5

这是我的查询。我的桌子销售超过600000行。我认为数据的数量不是太多,但需要大约50秒。 这是查询。

  

我需要更快。

SELECT
st.product_id,
prd.price_in_stock,
prd.product_name_eng,
prd.currency_id,
prd.product_name_kh,
(SELECT quantity
    FROM daily_stock
    WHERE stock_id = st.stock_id
    AND DATE (stock_date) = DATE (now())
) AS pre_stock_quantity,
(SELECT SUM (trrc.quantity)
    FROM transfer trs
    INNER JOIN transfer_detail trd 
ON trs.transfer_id = trd.transfer_id
    INNER JOIN transfer_received trrc
ON trrc.transfer_detail_id = trd.transfer_detail_id
    WHERE
        trs.transfer_from = st.branch_id
    AND trd.product_id = st.product_id
    AND DATE (trrc.received_date) = DATE (NOW())
) AS trasfered_quantity,
(SELECT SUM (trrc.quantity)
    FROM transfer trs
    INNER JOIN transfer_detail trd 
ON trs.transfer_id = trd.transfer_id
    INNER JOIN transfer_received trrc
ON trrc.transfer_detail_id = trd.transfer_detail_id
    WHERE
        trs.transfer_to = st.branch_id
    AND trd.product_id = st.product_id
    AND DATE (trrc.received_date) = DATE (NOW())
) AS received_quantity,
(SELECT (SUM (smallest_devisor (sd.product_id) 
             * sd.quantity 
             / getDevisor (sd.product_id, sd.unit_id)))
         / smallest_devisor (sd.product_id) AS sold_quantity
    FROM
        sale_detail sd
    INNER JOIN sale sa ON sa.sale_id = sd.sale_id
    WHERE
        sa.branch_id = st.branch_id
    AND sd.product_id = st.product_id
    AND DATE (sa.sale_date) = DATE (NOW())
    GROUP BY
        sd.product_id
),
(SELECT (SUM(smallest_devisor (sd.product_id) 
             * rp.quantity 
             / getDevisor (sd.product_id, sd.unit_id))
        ) / smallest_devisor (sd.product_id) AS returned_quantity
    FROM
        returned_product rp
    INNER JOIN sale_detail sd ON sd.sale_detail_id = rp.sale_detail_id
    WHERE
        rp.branch_id = st.branch_id
    AND sd.product_id = st.product_id
    AND DATE (rp.returned_date) = DATE (NOW())
    GROUP BY
        sd.product_id
),
(
    SELECT
        SUM (quantity) AS imported_quantity
    FROM
        import
    WHERE
        branch_id = st.branch_id
    AND product_id = st.product_id
    AND DATE (import_date) = DATE (NOW())
),
st.quantity AS post_stock_quantity
FROM
stock st
INNER JOIN product prd ON prd.product_id = st.product_id
LEFT JOIN import imp ON imp.product_id = st.product_id
WHERE
   st.branch_id = 'BR0000';

分析在这里,我已经看到嵌套循环花费了很多,但我不知道该怎么做。我不太了解他们,请解释一下。

Hash Left Join  (cost=2.45..210929.10 rows=4 width=99) (actual time=845.040..68556.076 rows=22 loops=1)
  Hash Cond: ((st.product_id)::text = (imp.product_id)::text)
  Buffers: shared hit=2362098 read=499796, temp read=63910 written=63781
  ->  Hash Join  (cost=1.11..11.36 rows=4 width=99) (actual time=0.130..0.160 rows=5 loops=1)
        Hash Cond: ((st.product_id)::text = (prd.product_id)::text)
        Buffers: shared hit=11
        ->  Seq Scan on stock st  (cost=0.00..10.19 rows=4 width=23) (actual time=0.025..0.041 rows=5 loops=1)
              Filter: ((branch_id)::text = 'BR0000'::text)
              Rows Removed by Filter: 10
              Buffers: shared hit=10
        ->  Hash  (cost=1.05..1.05 rows=5 width=114) (actual time=0.058..0.058 rows=5 loops=1)
              Buckets: 1024  Batches: 1  Memory Usage: 9kB
              Buffers: shared hit=1
              ->  Seq Scan on product prd  (cost=0.00..1.05 rows=5 width=114) (actual time=0.037..0.041 rows=5 loops=1)
                    Buffers: shared hit=1
  ->  Hash  (cost=1.15..1.15 rows=15 width=38) (actual time=0.041..0.041 rows=22 loops=1)
        Buckets: 1024  Batches: 1  Memory Usage: 9kB
        Buffers: shared hit=1
        ->  Seq Scan on import imp  (cost=0.00..1.15 rows=15 width=38) (actual time=0.009..0.019 rows=22 loops=1)
              Buffers: shared hit=1
  SubPlan 1
    ->  Seq Scan on daily_stock  (cost=0.00..48.25 rows=1 width=8) (actual time=0.010..0.011 rows=1 loops=22)
          Filter: ((stock_id = st.stock_id) AND (date(stock_date) = date(now())))
          Rows Removed by Filter: 29
          Buffers: shared hit=22
  SubPlan 2
    ->  Aggregate  (cost=52.41..52.42 rows=1 width=8) (actual time=0.010..0.010 rows=1 loops=22)
          ->  Nested Loop  (cost=0.15..52.41 rows=1 width=8) (actual time=0.008..0.008 rows=0 loops=22)
                ->  Nested Loop  (cost=0.00..45.56 rows=1 width=60) (actual time=0.001..0.001 rows=0 loops=22)
                      Join Filter: (trd.transfer_detail_id = trrc.transfer_detail_id)
                      ->  Seq Scan on transfer_received trrc  (cost=0.00..28.00 rows=4 width=12) (actual time=0.000..0.000 rows=0 loops=22)
                            Filter: (date(received_date) = date(now()))
                      ->  Materialize  (cost=0.00..17.39 rows=3 width=56) (never executed)
                            ->  Seq Scan on transfer_detail trd  (cost=0.00..17.38 rows=3 width=56) (never executed)
                                  Filter: ((product_id)::text = (st.product_id)::text)
                ->  Index Scan using transfer_pkey on transfer trs  (cost=0.15..6.83 rows=1 width=52) (never executed)
                      Index Cond: ((transfer_id)::text = (trd.transfer_id)::text)
                      Filter: ((transfer_from)::text = (st.branch_id)::text)
  SubPlan 3
    ->  Aggregate  (cost=52.41..52.42 rows=1 width=8) (actual time=0.007..0.007 rows=1 loops=22)
          ->  Nested Loop  (cost=0.15..52.41 rows=1 width=8) (actual time=0.005..0.005 rows=0 loops=22)
                ->  Nested Loop  (cost=0.00..45.56 rows=1 width=60) (actual time=0.000..0.000 rows=0 loops=22)
                      Join Filter: (trd_1.transfer_detail_id = trrc_1.transfer_detail_id)
                      ->  Seq Scan on transfer_received trrc_1  (cost=0.00..28.00 rows=4 width=12) (actual time=0.000..0.000 rows=0 loops=22)
                            Filter: (date(received_date) = date(now()))
                      ->  Materialize  (cost=0.00..17.39 rows=3 width=56) (never executed)
                            ->  Seq Scan on transfer_detail trd_1  (cost=0.00..17.38 rows=3 width=56) (never executed)
                                  Filter: ((product_id)::text = (st.product_id)::text)
                ->  Index Scan using transfer_pkey on transfer trs_1  (cost=0.15..6.83 rows=1 width=52) (never executed)
                      Index Cond: ((transfer_id)::text = (trd_1.transfer_id)::text)
                      Filter: ((transfer_to)::text = (st.branch_id)::text)
  SubPlan 4
    ->  GroupAggregate  (cost=32059.02..52563.95 rows=1 width=18) (actual time=3116.048..3116.048 rows=0 loops=22)
          Group Key: sd.product_id
          Buffers: shared hit=2362020 read=499796, temp read=63910 written=63781
          ->  Hash Join  (cost=32059.02..52045.08 rows=1007 width=18) (actual time=830.903..988.696 rows=53521 loops=22)
                Hash Cond: ((sd.sale_id)::text = (sa.sale_id)::text)
                Buffers: shared hit=7084 read=499796, temp read=63910 written=63781
                ->  Seq Scan on sale_detail sd  (cost=0.00..19220.90 rows=201358 width=35) (actual time=0.079..193.761 rows=292880 loops=22)
                      Filter: ((product_id)::text = (st.product_id)::text)
                      Rows Removed by Filter: 512552
                      Buffers: shared hit=3520 read=197846
                ->  Hash  (cost=32008.68..32008.68 rows=4027 width=17) (actual time=552.758..552.758 rows=147183 loops=22)
                      Buckets: 131072 (originally 4096)  Batches: 4 (originally 1)  Memory Usage: 3137kB
                      Buffers: shared hit=3564 read=301950, temp written=10934
                      ->  Seq Scan on sale sa  (cost=0.00..32008.68 rows=4027 width=17) (actual time=400.100..500.394 rows=147183 loops=22)
                            Filter: (((branch_id)::text = (st.branch_id)::text) AND (date(sale_date) = date(now())))
                            Rows Removed by Filter: 658225
                            Buffers: shared hit=3564 read=301950
  SubPlan 5
    ->  GroupAggregate  (cost=0.42..10.66 rows=1 width=18) (actual time=0.041..0.041 rows=0 loops=22)
          Group Key: sd_1.product_id
          Buffers: shared hit=22
          ->  Nested Loop  (cost=0.42..9.88 rows=1 width=18) (actual time=0.040..0.040 rows=0 loops=22)
                Buffers: shared hit=22
                ->  Seq Scan on returned_product rp  (cost=0.00..1.43 rows=1 width=12) (actual time=0.026..0.026 rows=0 loops=22)
                      Filter: (((branch_id)::text = (st.branch_id)::text) AND (date(returned_date) = date(now())))
                      Rows Removed by Filter: 19
                      Buffers: shared hit=22
                ->  Index Scan using sale_detail_pkey on sale_detail sd_1  (cost=0.42..8.45 rows=1 width=18) (never executed)
                      Index Cond: (sale_detail_id = rp.sale_detail_id)
                      Filter: ((product_id)::text = (st.product_id)::text)
  SubPlan 6
    ->  Aggregate  (cost=1.38..1.39 rows=1 width=8) (actual time=0.027..0.027 rows=1 loops=22)
          Buffers: shared hit=22
          ->  Seq Scan on import  (cost=0.00..1.38 rows=1 width=8) (actual time=0.018..0.018 rows=0 loops=22)
                Filter: (((branch_id)::text = (st.branch_id)::text) AND ((product_id)::text = (st.product_id)::text) AND (date(import_date) = date(now())))
                Rows Removed by Filter: 22
                Buffers: shared hit=22
Planning time: 4.046 ms
Execution time: 68557.361 ms

0 个答案:

没有答案