که یوه پوښتنه داسې فنکشن ولري چې د PARALLEL SAFE په نښه شوي نه وي، دا به یو واحد موضوع وي.
د SERIALIZABLE لیږد جلا کولو کچه موازي پروسس غیر فعالوي.
د ازموینې چاپیریال
د PostgreSQL پراختیا کونکو هڅه وکړه چې د TPC-H بنچمارک پوښتنو ځواب وخت کم کړي. بنچمارک ډاونلوډ کړئ او دا د PostgreSQL سره تطبیق کړئ. دا د TPC-H بنچمارک غیر رسمي کار دی - نه د ډیټابیس یا هارډویر پرتله کولو لپاره.
ډاټا تولید کړئ: ./dbgen -s 10 د 23 GB ډیټابیس جوړوي. دا کافي ده چې د موازي او غیر موازي پوښتنو په فعالیت کې توپیر وګورئ.
فایلونه بدل کړئ tbl в csv с for и sed.
ذخیره کلون کړئ pg_tpch او فایلونه کاپي کړئ csv в pg_tpch/dss/data.
د کمانډ سره پوښتنې رامینځته کړئ qgen.
ډیټابیس ته د کمانډ سره ډاټا بار کړئ ./tpch.sh.
موازي ترتیب سکین کول
دا ممکن د موازي لوستلو له امله ګړندی نه وي ، مګر ځکه چې ډاټا په ډیری CPU کورونو کې خپریږي. په عصري عملیاتي سیسټمونو کې، د PostgreSQL ډیټا فایلونه په ښه توګه ساتل کیږي. د مخکې لوستلو سره ، دا ممکنه ده چې د PG ډیمون غوښتنو په پرتله د ذخیره کولو څخه لوی بلاک ترلاسه کړئ. نو ځکه، د پوښتنو فعالیت د ډیسک I/O لخوا محدود ندی. دا د CPU دورې مصرفوي:
د میز له پاڼو څخه په یو وخت کې یو قطار ولولئ؛
د تار ارزښتونه او شرایط پرتله کړئ WHERE.
راځئ چې یوه ساده پوښتنه پرمخ بوځو select:
tpch=# explain analyze select l_quantity as sum_qty from lineitem where l_shipdate <= date '1998-12-01' - interval '105' day;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
Seq Scan on lineitem (cost=0.00..1964772.00 rows=58856235 width=5) (actual time=0.014..16951.669 rows=58839715 loops=1)
Filter: (l_shipdate <= '1998-08-18 00:00:00'::timestamp without time zone)
Rows Removed by Filter: 1146337
Planning Time: 0.203 ms
Execution Time: 19035.100 ms
د ترتیب سکین د راټولولو پرته ډیری قطارونه تولیدوي، نو دا پوښتنه د یو واحد CPU کور لخوا اجرا کیږي.
که تاسو اضافه کړئ SUM()، تاسو کولی شئ وګورئ چې دوه کاري جریان به د پوښتنې ګړندي کولو کې مرسته وکړي:
explain analyze select sum(l_quantity) as sum_qty from lineitem where l_shipdate <= date '1998-12-01' - interval '105' day;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------
Finalize Aggregate (cost=1589702.14..1589702.15 rows=1 width=32) (actual time=8553.365..8553.365 rows=1 loops=1)
-> Gather (cost=1589701.91..1589702.12 rows=2 width=32) (actual time=8553.241..8555.067 rows=3 loops=1)
Workers Planned: 2
Workers Launched: 2
-> Partial Aggregate (cost=1588701.91..1588701.92 rows=1 width=32) (actual time=8547.546..8547.546 rows=1 loops=3)
-> Parallel Seq Scan on lineitem (cost=0.00..1527393.33 rows=24523431 width=5) (actual time=0.038..5998.417 rows=19613238 loops=3)
Filter: (l_shipdate <= '1998-08-18 00:00:00'::timestamp without time zone)
Rows Removed by Filter: 382112
Planning Time: 0.241 ms
Execution Time: 8555.131 ms
parallel_tuple_cost: د مشر او کارکونکو تر منځ اړیکي د کاري پروسو څخه د ټپلونو د شمیر په تناسب ځنډول کیدی شي. دا پیرامیټر د معلوماتو تبادلې لګښت محاسبه کوي.
Nested Loop یوځای کیږي
PostgreSQL 9.6+ может выполнять вложенные циклы параллельно — это простая операция.
explain (costs off) select c_custkey, count(o_orderkey)
from customer left outer join orders on
c_custkey = o_custkey and o_comment not like '%special%deposits%'
group by c_custkey;
QUERY PLAN
--------------------------------------------------------------------------------------
Finalize GroupAggregate
Group Key: customer.c_custkey
-> Gather Merge
Workers Planned: 4
-> Partial GroupAggregate
Group Key: customer.c_custkey
-> Nested Loop Left Join
-> Parallel Index Only Scan using customer_pkey on customer
-> Index Scan using idx_orders_custkey on orders
Index Cond: (customer.c_custkey = o_custkey)
Filter: ((o_comment)::text !~~ '%special%deposits%'::text)
راټولول په وروستي پړاو کې واقع کیږي، نو د نیسټډ لوپ لیف جوین یو موازي عملیات دی. یوازې موازي شاخص سکین یوازې په 10 نسخه کې معرفي شوی. دا د موازي سیریل سکینګ سره ورته کار کوي. حالت c_custkey = o_custkey د هر پیرودونکي تار یو امر لوستل کیږي. نو دا موازي نه ده.
هش یوځای کیدل
هر کارګر پروسه تر PostgreSQL 11 پورې خپل هش میز جوړوي. او که چیرې د دې پروسو څخه څلور څخه زیات وي، فعالیت به ښه نشي. په نوې نسخه کې، د هش میز شریک شوی. هر کارګر پروسه کولی شي د هش میز جوړولو لپاره WORK_MEM وکاروي.
select
l_shipmode,
sum(case
when o_orderpriority = '1-URGENT'
or o_orderpriority = '2-HIGH'
then 1
else 0
end) as high_line_count,
sum(case
when o_orderpriority <> '1-URGENT'
and o_orderpriority <> '2-HIGH'
then 1
else 0
end) as low_line_count
from
orders,
lineitem
where
o_orderkey = l_orderkey
and l_shipmode in ('MAIL', 'AIR')
and l_commitdate < l_receiptdate
and l_shipdate < l_commitdate
and l_receiptdate >= date '1996-01-01'
and l_receiptdate < date '1996-01-01' + interval '1' year
group by
l_shipmode
order by
l_shipmode
LIMIT 1;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=1964755.66..1964961.44 rows=1 width=27) (actual time=7579.592..7922.997 rows=1 loops=1)
-> Finalize GroupAggregate (cost=1964755.66..1966196.11 rows=7 width=27) (actual time=7579.590..7579.591 rows=1 loops=1)
Group Key: lineitem.l_shipmode
-> Gather Merge (cost=1964755.66..1966195.83 rows=28 width=27) (actual time=7559.593..7922.319 rows=6 loops=1)
Workers Planned: 4
Workers Launched: 4
-> Partial GroupAggregate (cost=1963755.61..1965192.44 rows=7 width=27) (actual time=7548.103..7564.592 rows=2 loops=5)
Group Key: lineitem.l_shipmode
-> Sort (cost=1963755.61..1963935.20 rows=71838 width=27) (actual time=7530.280..7539.688 rows=62519 loops=5)
Sort Key: lineitem.l_shipmode
Sort Method: external merge Disk: 2304kB
Worker 0: Sort Method: external merge Disk: 2064kB
Worker 1: Sort Method: external merge Disk: 2384kB
Worker 2: Sort Method: external merge Disk: 2264kB
Worker 3: Sort Method: external merge Disk: 2336kB
-> Parallel Hash Join (cost=382571.01..1957960.99 rows=71838 width=27) (actual time=7036.917..7499.692 rows=62519 loops=5)
Hash Cond: (lineitem.l_orderkey = orders.o_orderkey)
-> Parallel Seq Scan on lineitem (cost=0.00..1552386.40 rows=71838 width=19) (actual time=0.583..4901.063 rows=62519 loops=5)
Filter: ((l_shipmode = ANY ('{MAIL,AIR}'::bpchar[])) AND (l_commitdate < l_receiptdate) AND (l_shipdate < l_commitdate) AND (l_receiptdate >= '1996-01-01'::date) AND (l_receiptdate < '1997-01-01 00:00:00'::timestamp without time zone))
Rows Removed by Filter: 11934691
-> Parallel Hash (cost=313722.45..313722.45 rows=3750045 width=20) (actual time=2011.518..2011.518 rows=3000000 loops=5)
Buckets: 65536 Batches: 256 Memory Usage: 3840kB
-> Parallel Seq Scan on orders (cost=0.00..313722.45 rows=3750045 width=20) (actual time=0.029..995.948 rows=3000000 loops=5)
Planning Time: 0.977 ms
Execution Time: 7923.770 ms
په PostgreSQL 11 کې د برخو سره اړیکه د ډیفالټ لخوا غیر فعال شوی: دا خورا ګران مهال ویش لري. میزونه د ورته ویش سره یوځای کیدی شي د ویشلو په واسطه ویشل کیږي. پدې توګه پوسټګریس به کوچني هش میزونه وکاروي. د برخو هر ارتباط موازي کیدی شي.
tpch=# set enable_partitionwise_join=t;
tpch=# explain (costs off) select * from prt1 t1, prt2 t2
where t1.a = t2.b and t1.b = 0 and t2.b between 0 and 10000;
QUERY PLAN
---------------------------------------------------
Append
-> Hash Join
Hash Cond: (t2.b = t1.a)
-> Seq Scan on prt2_p1 t2
Filter: ((b >= 0) AND (b <= 10000))
-> Hash
-> Seq Scan on prt1_p1 t1
Filter: (b = 0)
-> Hash Join
Hash Cond: (t2_1.b = t1_1.a)
-> Seq Scan on prt2_p2 t2_1
Filter: ((b >= 0) AND (b <= 10000))
-> Hash
-> Seq Scan on prt1_p2 t1_1
Filter: (b = 0)
tpch=# set parallel_setup_cost = 1;
tpch=# set parallel_tuple_cost = 0.01;
tpch=# explain (costs off) select * from prt1 t1, prt2 t2
where t1.a = t2.b and t1.b = 0 and t2.b between 0 and 10000;
QUERY PLAN
-----------------------------------------------------------
Gather
Workers Planned: 4
-> Parallel Append
-> Parallel Hash Join
Hash Cond: (t2_1.b = t1_1.a)
-> Parallel Seq Scan on prt2_p2 t2_1
Filter: ((b >= 0) AND (b <= 10000))
-> Parallel Hash
-> Parallel Seq Scan on prt1_p2 t1_1
Filter: (b = 0)
-> Parallel Hash Join
Hash Cond: (t2.b = t1.a)
-> Parallel Seq Scan on prt2_p1 t2
Filter: ((b >= 0) AND (b <= 10000))
-> Parallel Hash
-> Parallel Seq Scan on prt1_p1 t1
Filter: (b = 0)
اصلي شی دا ده چې په برخو کې اړیکه موازي ده که چیرې دا برخې په کافي اندازه لوی وي.
موازي ضمیمه
موازي ضمیمه په مختلف کاري جریانونو کې د مختلف بلاکونو پرځای کارول کیدی شي. دا معمولا د اتحادیې ټولو پوښتنو سره پیښیږي. نیمګړتیا لږ موازي ده، ځکه چې د هر کارګر پروسه یوازې د 1 غوښتنې پروسس کوي.
دلته د کارګرانو 2 پروسې روانې دي، که څه هم 4 فعال شوي.
tpch=# explain (costs off) select sum(l_quantity) as sum_qty from lineitem where l_shipdate <= date '1998-12-01' - interval '105' day union all select sum(l_quantity) as sum_qty from lineitem where l_shipdate <= date '2000-12-01' - interval '105' day;
QUERY PLAN
------------------------------------------------------------------------------------------------
Gather
Workers Planned: 2
-> Parallel Append
-> Aggregate
-> Seq Scan on lineitem
Filter: (l_shipdate <= '2000-08-18 00:00:00'::timestamp without time zone)
-> Aggregate
-> Seq Scan on lineitem lineitem_1
Filter: (l_shipdate <= '1998-08-18 00:00:00'::timestamp without time zone)