From: | Vivekk P <vivekkp(at)zeta(dot)tech> |
---|---|
To: | pgsql-general(at)lists(dot)postgresql(dot)org |
Subject: | Need recommendation on PARALLEL INDEX SCAN and PARALLEL APPEND |
Date: | 2021-10-26 06:09:01 |
Message-ID: | CAK-uzPsXpJVsM-w+6LNccR_JXVdMNb9yoYqpa-y9Jq4wOwxOQQ@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
Hi Team,
Please have a look on the below problem statement and suggest us if there
are any ways to make the planner pick PARALLEL INDEX SCAN and PARALLEL
APPEND
*Problem Statement :*
We have a partitioned table with a partition key column (crdt -->
timestamp). A SELECT query on this table that does not invoke the partition
key column undergoes INDEX SCAN on all the partitions and it is being
summed up in an APPEND node
Our requirement is to make the planner pick,
--PARALLEL INDEX SCAN instead of INDEX SCAN
--PARALLEL APPEND instead of APPEND
PostgreSQL version --> 13.4
*Table Structure :*
* Partitioned table "public.pay"* * Column | Type | Collation | Nullable |
Default*
-------------------------------+--------------------------+-----------+----------+-------------
id | bigint | | not null | pri | character varying(256) | | | prf |
character varying(128) | | | pi | character varying(256) | | | pas |
character varying(128) | | | s | payment_state | | not null | st | jsonb |
| not null | rct | character varying(32) | | | prf | jsonb | | | pa | jsonb
| | | always | jsonb | | | '{}'::jsonb pr | jsonb | | | pe | jsonb | | |
cda | jsonb | | | tr | jsonb | | | ar | jsonb | | | crq | jsonb | | | cr |
jsonb | | | prt | jsonb | | | rrq | jsonb | | | rtrt | jsonb | | | rrt |
jsonb | | | tc | character varying(32) | | | crdt | timestamp with time
zone | | not null | now() isfin | boolean | | | ifi | bigint | | | rid |
character varying(256) | | | pce | text | | | cce | text | | | pp | jsonb |
| | *Partition key: RANGE (crdt)* *Indexes:* "pay_pkey" PRIMARY KEY, btree
(id, crdt) "pay_businessid_storeid_crdt" btree ((pe ->>
'businessID'::text), (pe ->> 'storeID'::text), crdt) WHERE (pe ->>
'businessID'::text) IS NOT NULL AND (pe ->> 'storeID'::text) IS NOT NULL
"pay_crdt_index" btree (crdt) "pay_ifi_idx" btree (ifi) "pay_index_isfin"
btree (isfin) "pay_pi_pas_key" UNIQUE CONSTRAINT, btree (pi, pas, crdt)
"pay_pri_prf_key" UNIQUE CONSTRAINT, btree (pri, prf, crdt) "pay_rid_crdt"
btree (rid, crdt) WHERE rid IS NOT NULL AND crdt >= '2020-04-01
00:00:00+00'::timestamp with time zone "pay_tc_index" btree (tc, crdt)
"pay_user_id_pe_index" btree ((pe ->> 'userID'::text)) WHERE (pe ->>
'userID'::text) IS NOT NULL "pay_user_id_pr_index" btree ((pr ->>
'userID'::text)) WHERE (pr ->> 'userID'::text) IS NOT NULL *Triggers:*
pay_bucardo_delta AFTER INSERT OR DELETE OR UPDATE ON pay FOR EACH ROW
EXECUTE FUNCTION bucardo.delta_public_pay()
pay_bucardo_note_trunc_sync_payment_pay AFTER TRUNCATE ON pay FOR EACH
STATEMENT EXECUTE FUNCTION
bucardo.bucardo_note_truncation('sync_payment_pay')
pay_payment_completion_trigger_after_upsert AFTER INSERT OR UPDATE ON pay
FOR EACH ROW EXECUTE FUNCTION handle_payment_completion() *Triggers firing
always:* pay_trg_change_capture_pay AFTER INSERT OR UPDATE ON pay FOR EACH
ROW EXECUTE FUNCTION fun_change_capture_pay() Number of partitions: 4 (Use
\d+ to list them.)
*Partitions :*
p_p2021_09 FOR VALUES FROM ('2021-09-01 00:00:00+00') TO
('2021-10-01 00:00:00+00'),
p_p2021_10 FOR VALUES FROM ('2021-10-01 00:00:00+00') TO
('2021-11-01 00:00:00+00'),
p_p2021_11 FOR VALUES FROM ('2021-11-01 00:00:00+00') TO
('2021-12-01 00:00:00+00'),
p_default DEFAULT
*Table_size :*
*Name*
*Type*
*Size*
pay
partitioned table
0 bytes
p_default
table
8192 bytes
p_p2021_09
table
358 MB
p_p2021_10
table
370 MB
p_p2021_11
table
358 MB
*Note: *The table size will be in TB's in the actual scenario
*Query :*
SELECT id, pri, prf, pi, pas, s, st, a, rct, pr, pa, pr, pe, cda, crdt, tr,
ar, crq, cr, prt, tc, ifi, isfin, rrt, rrq, rtrt, rid, pce, cce, pp
FROM public.pay WHERE id = 3011852315482470422;
*Query Plan :*
pay=# EXPLAIN (ANALYZE,BUFFERS) SELECT id, pri, prf, pi, pas, s,
st, a, rct, pr, pa, pr, pe, cda, crdt,
tr, ar, crq, cr, prt, tc, ifi, isfin, rrt,
rrq, rtrt, rid, pce, cce, pp
FROM public.pay WHERE id = 3011852315482470422;
QUERY
PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Append (cost=0.29..33.09 rows=4 width=1931) (actual time=0.148..0.211
rows=0 loops=1)
Buffers: shared hit=8
-> Index Scan using pay_p2021_09_pkey on pay_p2021_09 pay_1
(cost=0.29..8.30 rows=1 width=1931) (actual time=0.015..0.022 rows=0
loops=1)
Index Cond: (id = '3011852315482470422'::bigint)
Buffers: shared hit=2
-> Index Scan using pay_p2021_10_pkey on pay_p2021_10 pay_2
(cost=0.29..8.30 rows=1 width=1931) (actual time=0.012..0.019 rows=0
loops=1)
Index Cond: (id = '3011852315482470422'::bigint)
Buffers: shared hit=2
-> Index Scan using pay_p2021_11_pkey on pay_p2021_11 pay_3
(cost=0.29..8.30 rows=1 width=1931) (actual time=0.012..0.019 rows=0
loops=1)
Index Cond: (id = '3011852315482470422'::bigint)
Buffers: shared hit=2
-> Index Scan using pay_default_pkey on pay_default pay_4
(cost=0.14..8.16 rows=1 width=1931) (actual time=0.010..0.017 rows=0
loops=1)
Index Cond: (id = '3011852315482470422'::bigint)
Buffers: shared hit=2
Planning:
Buffers: shared hit=292
Planning Time: 10.351 ms
Execution Time: 0.283 ms
Below are the workarounds that we have tried to get the desired results,
1. We have tried fine-tuning the below parameters with all possible values
to get the expected results but got no luck,
Parameter setting unit
enable_parallel_append on
enable_parallel_hash on
force_parallel_mode off
max_parallel_maintenance_workers 2
max_parallel_workers 8
max_parallel_workers_per_gather 2
min_parallel_index_scan_size 64 8kB
min_parallel_table_scan_size 1024 8kB
parallel_leader_participation on
parallel_setup_cost 1000
parallel_tuple_cost 0.1
effective_cache_size 4GB
shared_buffers 128MB
work_mem 4MB
2. Performed VACUUM ANALYZE on the partitioned tables
Kindly help us to improve the mentioned query performance by picking up
PARALLEL INDEX SCAN with PARALLEL APPEND node.
*Thanks & Regards*
Vivekk
PostgreSQL DBA
--
Disclaimer : This email (including any enclosed documents) is only
intended for the person(s) to whom it is addressed and may have
confidential information. Unless stated to the contrary, any opinions or
comments are personal to the writer and do not represent the official view
of the company. If you have received this email in error, please notify the
sender immediately by reply email. Also destroy all the electronic copies
by deleting the email irretrievably from your system and paper copies, if
any, by shredding the same. Please do not copy this email, use it for any
purposes, or disclose its contents to any other person. Any person
communicating with the company by email will be deemed to have accepted the
risks associated with sending information by email being interception,
amendment, and loss as well as the consequences of incomplete or late
delivery. Information contained in this email and any attachments may be
privileged or confidential and intended for the exclusive use of the
original recipient. Mistransmission is not intended to waive
confidentiality or privilege. To learn more about how we collect and
process your private and confidential information, please view our Privacy
Policy <https://www.zeta.tech/in/privacy-policy>. If you cannot access the
link, please notify us at security(at)zeta(dot)tech and we will send the contents
to you. By communicating with our company you acknowledge that you have
read, understood and have consented (wherever applicable), to the forgoing
and our company’s general disclaimers.
From | Date | Subject | |
---|---|---|---|
Next Message | Mitar | 2021-10-26 07:05:06 | Determining if a table really changed in a trigger |
Previous Message | Arun Suresh | 2021-10-26 06:04:40 | How to copy rows into same table efficiently |