Different plan between 9.6 and 9.4 when using "Group by"

From: 梁海安(Killua Leung) <LIANGHAIAN001(at)pingan(dot)com(dot)cn>
To: pgsql-performance(at)postgresql(dot)org
Subject: Different plan between 9.6 and 9.4 when using "Group by"
Date: 2017-05-27 08:40:46
Message-ID: C7033BC7E7882D4BBE21532AE40A020001B4E24DEE@PAMAILMBXA02.paicdom.local
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

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

********************************************************************************************************************************
The information in this email is confidential and may be legally privileged. If you have received this email in error or are not the intended recipient, please immediately notify the sender and delete this message from your computer. Any use, distribution, or copying of this email other than by the intended recipient is strictly prohibited. All messages sent to and from us may be monitored to ensure compliance with internal policies and to protect our business.
Emails are not secure and cannot be guaranteed to be error free as they can be intercepted, amended, lost or destroyed, or contain viruses. Anyone who communicates with us by email is taken to accept these risks.

收发邮件者请注意:
本邮件含涉密信息,请保守秘密,若误收本邮件,请务必通知发送人并直接删去,不得使用、传播或复制本邮件。
进出邮件均受到本公司合规监控。邮件可能发生被截留、被修改、丢失、被破坏或包含计算机病毒等不安全情况。
********************************************************************************************************************************

Responses

Browse pgsql-performance by date

  From Date Subject
Next Message Rick Otten 2017-05-27 12:26:31 Re: Client Server performance & UDS
Previous Message Dave Stibrany 2017-05-27 04:58:52 Re: [PERFORM] Monitoring tool for Postgres Database