Hi team: The following SQL is very slow in 9.6.1 for the plan has a
“sort” node. SQL text: explain(analyze, buffers, verbose, timing)WITH m as (SELECT date,accumulation,prod_type,IF,plan_code, mapping_code, channel, VARIABLE, up_load_data FROM sdm_actu_fore_up_act_nb WHERE fk_sdm_actu_fore_up_act_nb = 'd626e902-b3c5-495f-938f-3c6c74fa18da' ) , a as (SELECT date,accumulation,prod_type,IF,plan_code, mapping_code, channel, VARIABLE, up_load_data FROM m WHERE date = '1' AND VARIABLE ='FYP_FAC') , b as (SELECT date,mapping_code,channel,up_load_data FROM SDM_ACTU_FORE_UP_FYP_PROD WHERE FK_sdm_actu_fore_project_result = 'b9eece0c-60cc-403f-992f-9db9e9b78ee1' AND date >= '2017-01-31' ) , n as (SELECT a.plan_code,a.mapping_code,a.channel,a.variable,b.date, CASE WHEN (a.up_load_data::numeric) = 0 THEN 0 ELSE b.up_load_data/(a.up_load_data::numeric) END AS fdyz FROM a, b WHERE /*a.plan_code = b.plan_code and*/ a.mapping_code = b.mapping_code AND a.channel=b.channel ) SELECT 'b9eece0c-60cc-403f-992f-9db9e9b78ee1' FK_sdm_actu_fore_project_result, m.plan_code, m.mapping_code, m.accumulation, m.channel, m.prod_type, m.if, m.variable, 'PROF-IF' AS TYPE, ((date_trunc('month',add_months((n.date)::date,(m.date::numeric)))- interval '1 day')::date)::text, sum((m.up_load_data::numeric)*n.fdyz) FROM m, n WHERE m.mapping_code = n.mapping_code AND m.channel = n.channel GROUP BY m.plan_code, m.mapping_code, m.accumulation, m.channel, m.prod_type, m.if, m.variable, ((date_trunc('month',add_months((n.date)::date,(m.date::numeric)))- interval '1 day')::date)::text ; =========== Plan in 9.6.2: QUERY PL AN --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- GroupAggregate (cost=437554.59..437556.52 rows=22 width=352) (actual time=175322.440..192068.748 rows=1072820 loops=1) Output: 'b9eece0c-60cc-403f-992f-9db9e9b78ee1', m.plan_code, m.mapping_code, m.accumulation, m.channel, m.prod_type, m.if, m.variable, 'PROF-IF', ((((date_trunc('month'::text, ((((n.date )::date + ((((m.date)::numeric)::text || 'months'::text))::interval))::date)::timestamp with time zone) - '1 day'::interval))::date)::text), sum(((m.up_load_data)::numeric * n.fdyz)) Group Key: m.plan_code, m.mapping_code, m.accumulation, m.channel, m.prod_type, m.if, m.variable, ((((date_trunc('month'::text, ((((n.date)::date + ((((m.date)::numeric)::text || 'months '::text))::interval))::date)::timestamp with time zone) - '1 day'::interval))::date)::text) Buffers: shared hit=29835, temp read=168320 written=168320 CTE m -> Bitmap Heap Scan on public.sdm_actu_fore_up_act_nb (cost=22340.45..386925.95 rows=866760 width=60) (actual time=124.239..368.762 rows=895056 loops=1) Output: sdm_actu_fore_up_act_nb.date, sdm_actu_fore_up_act_nb.accumulation, sdm_actu_fore_up_act_nb.prod_type, sdm_actu_fore_up_act_nb.if, sdm_actu_fore_up_act_nb.plan_code, sdm_ actu_fore_up_act_nb.mapping_code, sdm_actu_fore_up_act_nb.channel, sdm_actu_fore_up_act_nb.variable, sdm_actu_fore_up_act_nb.up_load_data Recheck Cond: (sdm_actu_fore_up_act_nb.fk_sdm_actu_fore_up_act_nb = 'd626e902-b3c5-495f-938f-3c6c74fa18da'::text) Heap Blocks: exact=23005 Buffers: shared hit=29402 -> Bitmap Index Scan on ix_sdm_actu_fore_up_act_nb (cost=0.00..22123.76 rows=866760 width=0) (actual time=119.406..119.406 rows=895056 loops=1) Index Cond: (sdm_actu_fore_up_act_nb.fk_sdm_actu_fore_up_act_nb = 'd626e902-b3c5-495f-938f-3c6c74fa18da'::text) Buffers: shared hit=6397 CTE a -> CTE Scan on m m_1 (cost=0.00..21669.00 rows=22 width=288) (actual time=3.972..743.152 rows=289 loops=1) Output: m_1.date, m_1.accumulation, m_1.prod_type, m_1.if, m_1.plan_code, m_1.mapping_code, m_1.channel, m_1.variable, m_1.up_load_data Filter: ((m_1.date = '1'::text) AND (m_1.variable = 'FYP_FAC'::text)) Rows Removed by Filter: 894767 Buffers: shared hit=23004 CTE b -> Bitmap Heap Scan on public.sdm_actu_fore_up_fyp_prod (cost=124.14..5052.60 rows=2497 width=33) (actual time=2.145..4.566 rows=4752 loops=1) Output: sdm_actu_fore_up_fyp_prod.date, sdm_actu_fore_up_fyp_prod.mapping_code, sdm_actu_fore_up_fyp_prod.channel, sdm_actu_fore_up_fyp_prod.up_load_data Recheck Cond: (sdm_actu_fore_up_fyp_prod.fk_sdm_actu_fore_project_result = 'b9eece0c-60cc-403f-992f-9db9e9b78ee1'::text) Filter: (sdm_actu_fore_up_fyp_prod.date >= '2017-01-31'::text) Heap Blocks: exact=315 Buffers: shared hit=433 -> Bitmap Index Scan on ix_sdm_actu_fore_up_fyp_prod (cost=0.00..123.52 rows=4746 width=0) (actual time=1.863..1.863 rows=14256 loops=1) Index Cond: (sdm_actu_fore_up_fyp_prod.fk_sdm_actu_fore_project_result = 'b9eece0c-60cc-403f-992f-9db9e9b78ee1'::text) Buffers: shared hit=118 CTE n -> Hash Join (cost=0.77..69.46 rows=1 width=192) (actual time=745.835..756.304 rows=4764 loops=1) Output: a.plan_code, a.mapping_code, a.channel, a.variable, b.date, CASE WHEN ((a.up_load_data)::numeric = '0'::numeric) THEN '0'::numeric ELSE (b.up_load_data / (a.up_load_data) ::numeric) END Hash Cond: ((b.mapping_code = a.mapping_code) AND (b.channel = a.channel)) Buffers: shared hit=23437 -> CTE Scan on b (cost=0.00..49.94 rows=2497 width=128) (actual time=2.147..6.445 rows=4752 loops=1) Output: b.date, b.mapping_code, b.channel, b.up_load_data Buffers: shared hit=433 -> Hash (cost=0.44..0.44 rows=22 width=160) (actual time=743.661..743.661 rows=289 loops=1) Output: a.plan_code, a.mapping_code, a.channel, a.variable, a.up_load_data Buckets: 1024 Batches: 1 Memory Usage: 29kB Buffers: shared hit=23004 -> CTE Scan on a (cost=0.00..0.44 rows=22 width=160) (actual time=3.974..743.380 rows=289 loops=1) Output: a.plan_code, a.mapping_code, a.channel, a.variable, a.up_load_data Buffers: shared hit=23004
-> Sort (cost=23837.58..23837.64 rows=22 width=320) (actual time=175322.411..178986.480 rows=14620032 loops=1) Output: m.plan_code, m.mapping_code, m.accumulation, m.channel, m.prod_type, m.if, m.variable, ((((date_trunc('month'::text, ((((n.date)::date +
((((m.date)::numeric)::text || 'mon ths'::text))::interval))::date)::timestamp with time zone) - '1 day'::interval))::date)::text), m.up_load_data, n.fdyz Sort Key: m.plan_code, m.mapping_code, m.accumulation, m.channel, m.prod_type, m.if, m.variable, ((((date_trunc('month'::text, ((((n.date)::date
+ ((((m.date)::numeric)::text || 'm onths'::text))::interval))::date)::timestamp with time zone) - '1 day'::interval))::date)::text) Sort Method: external merge Disk: 1346544kB Buffers: shared hit=29835, temp read=168320 written=168320 -> Hash Join (cost=0.04..23837.09 rows=22 width=320) (actual time=884.588..27338.979 rows=14620032 loops=1) Output: m.plan_code, m.mapping_code, m.accumulation, m.channel, m.prod_type, m.if, m.variable, (((date_trunc('month'::text, ((((n.date)::date + ((((m.date)::numeric)::text || 'months'::text))::interval))::date)::timestamp with time zone) - '1 day'::interval))::date)::text, m.up_load_data, n.fdyz Hash Cond: ((m.mapping_code = n.mapping_code) AND (m.channel = n.channel)) Buffers: shared hit=29835 -> CTE Scan on m (cost=0.00..17335.20 rows=866760 width=288) (actual time=124.243..263.402 rows=895056 loops=1) Output: m.date, m.accumulation, m.prod_type, m.if, m.plan_code, m.mapping_code, m.channel, m.variable, m.up_load_data Buffers: shared hit=6398 -> Hash (cost=0.02..0.02 rows=1 width=128) (actual time=760.302..760.302 rows=4764 loops=1) Output: n.date, n.fdyz, n.mapping_code, n.channel Buckets: 8192 (originally 1024) Batches: 1 (originally 1) Memory Usage: 389kB Buffers: shared hit=23437 -> CTE Scan on n (cost=0.00..0.02 rows=1 width=128) (actual time=745.838..759.139 rows=4764 loops=1) Output: n.date, n.fdyz, n.mapping_code, n.channel Buffers: shared hit=23437 Planning time: 0.383 ms Execution time: 192187.911 ms (65 rows) Time: 192192.814 ms ========== Plan in 9.4.1 QUERY PL AN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- HashAggregate (cost=478276.30..478278.89 rows=47 width=352) (actual time=92967.646..93660.910 rows=1072820 loops=1) Output: 'b9eece0c-60cc-403f-992f-9db9e9b78ee1', m.plan_code, m.mapping_code, m.accumulation, m.channel, m.prod_type, m.if, m.variable, 'PROF-IF', ((((date_trunc('month'::text, ((((n.date )::date + ((((m.date)::numeric)::text || 'months'::text))::interval))::date)::timestamp with time zone) - '1 day'::interval))::date)::text), sum(((m.up_load_data)::numeric * n.fdyz)) Group Key: m.plan_code, m.mapping_code, m.accumulation, m.channel, m.prod_type, m.if, m.variable, (((date_trunc('month'::text, ((((n.date)::date + ((((m.date)::numeric)::text || 'months' ::text))::interval))::date)::timestamp with time zone) - '1 day'::interval))::date)::text Buffers: shared hit=30869, temp read=8103 written=8102 CTE m -> Bitmap Heap Scan on public.sdm_actu_fore_up_act_nb (cost=37491.97..421474.67 rows=942376 width=60) (actual time=158.435..465.865 rows=895056 loops=1) Output: sdm_actu_fore_up_act_nb.date, sdm_actu_fore_up_act_nb.accumulation, sdm_actu_fore_up_act_nb.prod_type, sdm_actu_fore_up_act_nb.if, sdm_actu_fore_up_act_nb.plan_code, sdm_ actu_fore_up_act_nb.mapping_code, sdm_actu_fore_up_act_nb.channel, sdm_actu_fore_up_act_nb.variable, sdm_actu_fore_up_act_nb.up_load_data Recheck Cond: (sdm_actu_fore_up_act_nb.fk_sdm_actu_fore_up_act_nb = 'd626e902-b3c5-495f-938f-3c6c74fa18da'::text) Heap Blocks: exact=23006 Buffers: shared hit=30422 -> Bitmap Index Scan on ix_sdm_actu_fore_up_act_nb (cost=0.00..37256.38 rows=942376 width=0) (actual time=153.180..153.180 rows=895056 loops=1) Index Cond: (sdm_actu_fore_up_act_nb.fk_sdm_actu_fore_up_act_nb = 'd626e902-b3c5-495f-938f-3c6c74fa18da'::text) Buffers: shared hit=7416 CTE a -> CTE Scan on m m_1 (cost=0.00..23559.40 rows=24 width=288) (actual time=5.386..1227.412 rows=289 loops=1) Output: m_1.date, m_1.accumulation, m_1.prod_type, m_1.if, m_1.plan_code, m_1.mapping_code, m_1.channel, m_1.variable, m_1.up_load_data Filter: ((m_1.date = '1'::text) AND (m_1.variable = 'FYP_FAC'::text)) Rows Removed by Filter: 894767 Buffers: shared hit=23005, temp written=8101 CTE b -> Bitmap Heap Scan on public.sdm_actu_fore_up_fyp_prod (cost=221.97..7251.24 rows=2575 width=33) (actual time=2.623..6.318 rows=4752 loops=1) Output: sdm_actu_fore_up_fyp_prod.date, sdm_actu_fore_up_fyp_prod.mapping_code, sdm_actu_fore_up_fyp_prod.channel, sdm_actu_fore_up_fyp_prod.up_load_data Recheck Cond: (sdm_actu_fore_up_fyp_prod.fk_sdm_actu_fore_project_result = 'b9eece0c-60cc-403f-992f-9db9e9b78ee1'::text) Filter: (sdm_actu_fore_up_fyp_prod.date >= '2017-01-31'::text) Heap Blocks: exact=327 Buffers: shared hit=447 -> Bitmap Index Scan on ix_sdm_actu_fore_up_fyp_prod (cost=0.00..221.32 rows=4920 width=0) (actual time=2.313..2.313 rows=14256 loops=1) Index Cond: (sdm_actu_fore_up_fyp_prod.fk_sdm_actu_fore_project_result = 'b9eece0c-60cc-403f-992f-9db9e9b78ee1'::text) Buffers: shared hit=120 CTE n -> Hash Join (cost=0.84..71.70 rows=2 width=224) (actual time=1230.640..1245.947 rows=4764 loops=1) Output: a.plan_code, a.mapping_code, a.channel, a.variable, b.date, CASE WHEN ((a.up_load_data)::numeric = 0::numeric) THEN 0::numeric ELSE (b.up_load_data / (a.up_load_data)::nu meric) END Hash Cond: ((b.mapping_code = a.mapping_code) AND (b.channel = a.channel)) Buffers: shared hit=23452, temp written=8101 -> CTE Scan on b (cost=0.00..51.50 rows=2575 width=128) (actual time=2.626..8.904 rows=4752 loops=1) Output: b.date, b.mapping_code, b.channel, b.up_load_data Buffers: shared hit=447 -> Hash (cost=0.48..0.48 rows=24 width=160) (actual time=1227.982..1227.982 rows=289 loops=1) Output: a.plan_code, a.mapping_code, a.channel, a.variable, a.up_load_data Buckets: 1024 Batches: 1 Memory Usage: 21kB Buffers: shared hit=23005, temp written=8101 -> CTE Scan on a (cost=0.00..0.48 rows=24 width=160) (actual time=5.387..1227.668 rows=289 loops=1) Output: a.plan_code, a.mapping_code, a.channel, a.variable, a.up_load_data Buffers: shared hit=23005, temp written=8101 -> Hash Join (cost=0.07..25917.88 rows=47 width=352) (actual time=1410.018..61022.859 rows=14620032 loops=1) Output: m.plan_code, m.mapping_code, m.accumulation, m.channel, m.prod_type, m.if, m.variable, (((date_trunc('month'::text, ((((n.date)::date + ((((m.date)::numeric)::text || 'mont hs'::text))::interval))::date)::timestamp with time zone) - '1 day'::interval))::date)::text, m.up_load_data, n.fdyz Hash Cond: ((m.mapping_code = n.mapping_code) AND (m.channel = n.channel)) Buffers: shared hit=30869, temp read=8103 written=8102 -> CTE Scan on m (cost=0.00..18847.52 rows=942376 width=288) (actual time=158.442..558.052 rows=895056 loops=1) Output: m.date, m.accumulation, m.prod_type, m.if, m.plan_code, m.mapping_code, m.channel, m.variable, m.up_load_data Buffers: shared hit=7417, temp read=8103 written=1 -> Hash (cost=0.04..0.04 rows=2 width=128) (actual time=1251.514..1251.514 rows=4764 loops=1) Output: n.date, n.fdyz, n.mapping_code, n.channel Buckets: 1024 Batches: 1 Memory Usage: 325kB Buffers: shared hit=23452, temp written=8101 -> CTE Scan on n (cost=0.00..0.04 rows=2 width=128) (actual time=1230.643..1249.718 rows=4764 loops=1) Output: n.date, n.fdyz, n.mapping_code, n.channel Buffers: shared hit=23452, temp written=8101 Planning time: 0.666 ms Execution time: 93783.172 ms (60 rows) Time: 93790.518 ms
收发邮件者请注意: |