Paralleelsed pÀringud PostgreSQL-is

Paralleelsed pÀringud PostgreSQL-is
Kaasaegsetes protsessorites on vĂ€ga palju sĂŒdamikke. Aastaid on rakendused andmebaasidele pĂ€ringute saatmiseks töötanud paralleelselt. Kui see on aruande pĂ€ring, mis hĂ”lmab mitmeid tabeleid, siis toimub see kiiremini, kui kasutatakse mitut protsessorit, ja PostgreSQL-is on see vĂ”imalik alates versioonist 9.6.

Kulutasime 3 aastat paralleelsete pĂ€ringute funktsiooni rakendamisele — tuli kirjutada kood ĂŒmber erinevatel pĂ€ringu tĂ€itmise etappidel. PostgreSQL 9.6 tĂ”i kaasa infrastruktuuri koodi edasiseks tĂ€iustamiseks. Hilisemates versioonides saavad ka teised pĂ€ringutĂŒĂŒbid töötada paralleelselt.

Piirangud

  • Ärge lĂŒlitage paralleelset tĂ€itmist sisse, kui kĂ”ik protsessorisĂŒdamikud on juba hĂ”ivatud, vastasel juhul aeglustavad teised pĂ€ringud.
  • Peamine asi on see, et kĂ”rge WORK_MEM vÀÀrtusega paralleelne töötlemine kasutab palju mĂ€lu — iga hash-ĂŒhendus vĂ”i sortimine vajab mĂ€lu vastavalt work_mem-i mahule.
  • OLTP pĂ€ringud, millel on madal latentsus, ei saa paralleelse tĂ€itmisega kiiremaks muutuda. Ja kui pĂ€ring tagastab ainult ĂŒhe rea, siis pĂ€ringute paralleelne töötlemine ainult aeglustab seda.
  • Arendajad armastavad kasutada TPC-H tulemusi. VĂ”ib-olla on teil sarnaseid pĂ€ringuid ideaalse paralleelse tĂ€itmise jaoks.
  • Ainult SELECT pĂ€ringud, millel ei ole predikaadi lukustust, saavad töötada paralleelselt.
  • MĂ”nikord on Ă”ige indekseerimine parem kui tabeli jĂ€rjestikune skaneerimine paralleelses reĆŸiimis.
  • PĂ€ringute peatamine ja kursused ei ole toetatud.
  • Aknafunktsioonid ja jĂ€rjestatud komplektide agregaadifunktsioonid ei ole paralleelsed.
  • Te ei saavutada sisend-vĂ€ljund koormuses midagi.
  • Paralleelseid jĂ€rjestusalgoritme ei eksisteeri. Kuid sortimiseta pĂ€ringud saavad mĂ”nedes aspektides töötada paralleelselt.
  • Asendage CTE (WITH 
) sisemise SELECT-iga, et lubada paralleelset töötlemist.
  • Kolmandate osapoolte andmete mĂ€hised ei toeta veel paralleelset töötlemist (kuigi vĂ”iks!).
  • FULL OUTER JOIN ei ole toetatud.
  • max_rows vĂ€listab paralleelse töötlemise.
  • Kui pĂ€ringus on funktsioon, mida ei ole mĂ€rgitud kui PARALLEL SAFE, on see ĂŒhe protsessoriga.
  • Tehingute isolatsiooni tase SERIALIZABLE vĂ€listab paralleelse töötlemise.

Testimisalune

PostgreSQL arendajad pĂŒĂŒdsid vĂ€hendada TPC-H mÔÔtmise pĂ€ringute reageerimise aega. Laadige alla mÔÔtmine ja kohandage see PostgreSQL-iga. See TPC-H mÔÔtmise mitteametlik kasutamine ei ole mĂ”eldud andmebaaside vĂ”i varustuse vĂ”rdlemiseks.

  1. Lae alla TPC-H_Tools_v2.17.3.zip (vÔi uuem versioon) TPC veebisaidilt.
  2. Nimeta makefile.suite ĂŒmber Makefile'iks ja muuda nagu siin on kirjeldatud: https://github.com/tvondra/pg_tpch . Koodi kompileerimiseks kasuta kĂ€sku make.
  3. Genereeri andmed: .\/dbgen -s 10 loomiseks suurus 23 GB. Seda on piisavalt, et nÀha erinevusi paralleelsete ja mitteparalleelsete pÀringute tulemustes.
  4. Muuda failid tbl ja csv for ja sed.
  5. Kloonige hoidla pg_tpch ja kopeerige failid csv ja pg_tpch\/dss\/data.
  6. Looge pÀringud kÀsuga qgen.
  7. Laadige andmed andmebaasi kÀsuga .\/tpch.sh.

Paralleelne jÀrjestikune skaneerimine

See vĂ”ib olla kiirem mitte paralleelse lugemise tĂ”ttu, vaid kuna andmed on jaotatud paljude protsessorituumade vahel. Kaasaegsetes opsĂŒsteemides PostgreSQL andmefailid vahemĂ€lustuvad hĂ€sti. Eelneva lugemise abil saab salvestusmuutjalt lugeda rohkem plokke, kui PG teenus nĂ”uab. SeetĂ”ttu ei piira pĂ€ringu jĂ”udlus ketta sisend-vĂ€ljundit. See kulutab protsessori tsĂŒkleid, et:

  • lugeda ridu ĂŒkshaaval tabeli lehtedelt;
  • vĂ”rrelda ridade vÀÀrtusi ja tingimusi KUS.

Teeme lihtsa pÀringu select:

tpch=# selgita analĂŒĂŒsi pĂ€ringut select l_quantity as sum_qty from lineitem where l_shipdate <= date '1998-12-01' - interval '105' day;
KÜSIMUSE PLaan
--------------------------------------------------------------------------------------------------------------------------
JĂ€rjekordne skaneerimine lineitem (kulu=0.00..1964772.00 read=58856235 laius=5) (aktiivne aeg=0.014..16951.669 read=58839715 tsĂŒklid=1)
Filter: (l_shipdate <= '1998-08-18 00:00:00'::timestamp ilma ajavööndita)
Filtri jÀrgi eemaldatud read: 1146337
Planeerimise aeg: 0.203 ms
Teostamise aeg: 19035.100 ms

JĂ€rjekordne skaneerimine annab liigselt ridu ilma agregatsioonita, nii et pĂ€ring tehakse ĂŒhe protsessorituuma poolt.

Kui lisada SUM(), on nÀha, et kaks tööhÔivet aitavad pÀringu kiirusel:

selgita analĂŒĂŒsi pĂ€ringut select sum(l_quantity) as sum_qty from lineitem where l_shipdate <= date '1998-12-01' - interval '105' day;
KÜSIMUSE PLaan
----------------------------------------------------------------------------------------------------------------------------------------------------
LĂ”peta agregaat (kulu=1589702.14..1589702.15 read=1 laius=32) (aktiivne aeg=8553.365..8553.365 read=1 tsĂŒklid=1)
-> Koguge (kulu=1589701.91..1589702.12 read=2 laius=32) (aktiivne aeg=8553.241..8555.067 read=3 tsĂŒklid=1)
Plaanitavad töötajad: 2
KÀivitatud töötajad: 2
-> Osaline agregaat (kulu=1588701.91..1588701.92 read=1 laius=32) (aktiivne aeg=8547.546..8547.546 read=1 tsĂŒklid=3)
-> Paralleelne jĂ€rjekordne skaneerimine lineitem (kulu=0.00..1527393.33 read=24523431 laius=5) (aktiivne aeg=0.038..5998.417 read=19613238 tsĂŒklid=3)
Filter: (l_shipdate <= '1998-08-18 00:00:00'::timestamp ilma ajavööndita)
Filtri jÀrgi eemaldatud read: 382112
Planeerimise aeg: 0.241 ms
Teostamise aeg: 8555.131 ms

Paralleelne agregatsioon

SĂ”lm „Paralleelne jĂ€rjekordne skaneerimine“ genereerib ridu osalisteks agregatsioonideks. SĂ”lm „Osaline agregaat“ kĂ€rbib neid ridu SUM(). LĂ”pus kogub iga töötaja SUM-i loenduri sĂ”lm „Kogu“.

LĂ”plik tulemus arvutatakse sĂ”lmes „Finalize Aggregate“. Kui teil on oma aggregeerimisfunktsioonid, Ă€rge unustage neid mĂ€rkida kui „parallel safe.“

Tööprotsesside arv

Tööprotsesside arvu saab suurendada ilma serveri taaskÀivitamiseta:

selgita analĂŒĂŒsi pĂ€ringut select sum(l_quantity) as sum_qty from lineitem where l_shipdate <= date '1998-12-01' - interval '105' day;
KÜSIMUSE PLaan
----------------------------------------------------------------------------------------------------------------------------------------------------
LĂ”peta agregaat (kulu=1589702.14..1589702.15 read=1 laius=32) (aktiivne aeg=8553.365..8553.365 read=1 tsĂŒklid=1)
-> Koguge (kulu=1589701.91..1589702.12 read=2 laius=32) (aktiivne aeg=8553.241..8555.067 read=3 tsĂŒklid=1)
Plaanitavad töötajad: 2
KÀivitatud töötajad: 2
-> Osaline agregaat (kulu=1588701.91..1588701.92 read=1 laius=32) (aktiivne aeg=8547.546..8547.546 read=1 tsĂŒklid=3)
-> Paralleelne jĂ€rjekordne skaneerimine lineitem (kulu=0.00..1527393.33 read=24523431 laius=5) (aktiivne aeg=0.038..5998.417 read=19613238 tsĂŒklid=3)
Filter: (l_shipdate <= '1998-08-18 00:00:00'::timestamp ilma ajavööndita)
Filtri jÀrgi eemaldatud read: 382112
Planeerimise aeg: 0.241 ms
Teostamise aeg: 8555.131 ms

Mis siin juhtub? Tööprotsesside arv on kahekordistunud, kuid pÀring on muutunud vaid 1,6599 korda kiiremaks. Arvutused on huvitavad. Meil oli 2 tööprotsessi ja 1 juht. PÀrast muutmist on see 4+1.

Meie maksimaalne kiirus, mis tuleneb paralleelsest töötlemisest: 5/3 = 1,66(6) korda.

Kuidas see töötab?

Protsessid

PĂ€ringu tĂ€itmine algab alati juhtimisprotsessist. Juht tegeleb kĂ”igi mitte-paralleelsete ja osa paralleelse töötlemisega. Teisi protsesse, mis tĂ€idavad samu pĂ€ringuid, nimetatakse tööprotsessideks. Paralleelne töötlemine kasutab infrastruktuuri dĂŒnaamiliste taustatööprotsesside (alates versioonist 9.4). Kuna PostgreSQL muud osad kasutavad protsesse, mitte lĂ”ime, vĂ”is pĂ€ring 3 tööprotsessiga olla 4 korda kiirem traditsioonilisest töötlemisest.

Koostöö

Tööprotsessid suhtlevad juhiga sĂ”numijĂ€rjekorra kaudu (ĂŒldise mĂ€lu pĂ”hjal). Igal protsessil on 2 jĂ€rjekorda: veaparanduse ja tuplede jaoks.

Kui palju tööprotsesse on vaja?

Minimaalne piirang mÀÀrab parameeter max_parallel_workers_per_gather. Siis pÀringute tÀitja vÔtab tööprotsessid basseinist, mida piirab parameeter max_parallel_workers size. Viimane piirang on max_worker_processes, st taustprotsesside koguarv.

Kui tööprotsessi eraldamine ebaĂ”nnestub, on töötlemine ĂŒhes protsessis.

PÀringute planeerija vÔib vÀhendada tööprotsesside arvu tabeli vÔi indeksi suuruse pÔhjal. Selleks on olemas parameetrid min_parallel_table_scan_size ja min_parallel_index_scan_size.

set min_parallel_table_scan_size='8MB'
8MB tabel => 1 töötaja
24MB tabel => 2 töötajat
72MB tabel => 3 töötajat
x => log(x / min_parallel_table_scan_size) / log(3) + 1 töötaja

Igal korral, kui tabel on 3 korda suurem kui min_parallel_(index|table)_scan_size, lisab Postgres tööprotsessi. Tööprotsesside arv ei pÔhine kuludel. Ringikujuline sÔltuvus raskendab keeruliste rakenduste loomist. Selle asemel kasutab planeerija lihtsaid reegleid.

Praktikas ei ole need reeglid alati tootmisoludes sobivad, seega on vĂ”imalik muuta tööprotsesside arvu konkreetse tabeli jaoks: ALTER TABLE 
 SET (parallel_workers = N).

Miks paralleelset töötlemist ei kasutata?

Lisaks pika nimekirja piirangutele on veel kulude kontrollid:

parallel_setup_cost — et vĂ€ltida lĂŒhikeste pĂ€ringute paralleelset töötlemist. See parameeter hindab mĂ€lu ettevalmistamise, protsessi kĂ€ivitamise ja esialgse andmevahetuse aega.

parallel_tuple_cost: juhendaja vahetus teiste töötajatega vÔib pikendada proportsionaalselt töötlemiste arvu tÔttu. See parameeter arvestab andmevahetuse kulusid.

Sisemised tsĂŒklite ĂŒhendused — Nested Loop Join

PostgreSQL 9.6+ suudab paralleelselt tĂ€ita pesatud tsĂŒklit — see on lihtne operatsioon.

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 '%specialposits%'
 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 !~~ '%specialposits%'::text)

Kogumine toimub viimases etapis, seega on Nested Loop Left Join paralleelne operatsioon. Parallel Index Only Scan ilmus alles versioonis 10. See töötab sarnaselt paralleelsele jĂ€rjestikusele skaneerimisele. Tingimus c_custkey = o_custkey loeb iga kliendi rea jaoks ĂŒhe tellimuse. Seega see ei ole paralleelne.

Rohesidel ĂŒhendamine — Hash Join

Iga töötlemisprotsess loob oma hĂ€shtiabeli kuni PostgreSQL 11. Ja kui neid protsesse on rohkem kui neli, ei parane jĂ”udlus. Uues versioonis on hĂ€stitaabel ĂŒhine. Iga töötlemisprotsess vĂ”ib kasutada WORK_MEM, et luua hĂ€shtiabel.

valige
        l_shipmode,
        sum(case
                kui o_orderpriority = '1-URGENT'
                        vÔi o_orderpriority = '2-HIGH'
                        siis 1
                muu juhul 0
        end) kui high_line_count,
        sum(case
                kui o_orderpriority  '1-URGENT'
                        ja o_orderpriority  '2-HIGH'
                        siis 1
                muu juhul 0
        end) kui low_line_count
alates
        orders,
        lineitem
kui
        o_orderkey = l_orderkey
        ja l_shipmode in ('MAIL', 'AIR')
        ja l_commitdate < l_receiptdate
        ja l_shipdate = kuupÀev '1996-01-01'
        ja l_receiptdate < kuupÀev '1996-01-01' + intervall '1' aasta
rĂŒhmitama
        l_shipmode
jÀrjestama
        l_shipmode
PIIRDED 1;
                                                                                                                                    KÜSIMUSE PLANEERIMINE
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Piirang (kulud=1964755.66..1964961.44 read=1 laius=27) (tegelik aeg=7579.592..7922.997 read=1 tsĂŒklis=1)
   ->  Finalize GroupAggregate  (kulud=1964755.66..1966196.11 read=7 laius=27) (tegelik aeg=7579.590..7579.591 read=1 tsĂŒklis=1)
         RĂŒhma vĂ”ti: lineitem.l_shipmode
         ->  Gather Merge  (kulud=1964755.66..1966195.83 read=28 laius=27) (tegelik aeg=7559.593..7922.319 read=6 tsĂŒklis=1)
               Planeeritud töötajad: 4
               Alustatud töötajad: 4
               ->  Partial GroupAggregate  (kulud=1963755.61..1965192.44 read=7 laius=27) (tegelik aeg=7548.103..7564.592 read=2 tsĂŒklis=5)
                     RĂŒhma vĂ”ti: lineitem.l_shipmode
                     ->  Sort  (kulud=1963755.61..1963935.20 read=71838 laius=27) (tegelik aeg=7530.280..7539.688 read=62519 tsĂŒklis=5)
                           SortimisvÔti: lineitem.l_shipmode
                           Sortimise meetod: vÀlispidine liitmine Disk: 2304kB
                           Tööline 0:  Sortimise meetod: vÀlispidine liitmine Disk: 2064kB
                           Tööline 1:  Sortimise meetod: vÀlispidine liitmine Disk: 2384kB
                           Tööline 2:  Sortimise meetod: vÀlispidine liitmine Disk: 2264kB
                           Tööline 3:  Sortimise meetod: vÀlispidine liitmine Disk: 2336kB
                           ->  Parallel Hash Join  (kulud=382571.01..1957960.99 read=71838 laius=27) (tegelik aeg=7036.917..7499.692 read=62519 tsĂŒklis=5)
                                 Hash Tingimus: (lineitem.l_orderkey = orders.o_orderkey)
                                 ->  Parallel Seq Scan on lineitem  (kulud=0.00..1552386.40 read=71838 laius=19) (tegelik aeg=0.583..4901.063 read=62519 tsĂŒklis=5)
                                       Filter: ((l_shipmode = ANY ('{MAIL,AIR}'::bpchar[])) JA (l_commitdate < l_receiptdate) JA (l_shipdate = '1996-01-01'::kuupÀev) JA (l_receiptdate < '1997-01-01 00:00:00'::aeg ilma ajavööndita))
                                       Ridu eemaldatud filtrist: 11934691
                                 ->  Parallel Hash  (kulud=313722.45..313722.45 read=3750045 laius=20) (tegelik aeg=2011.518..2011.518 read=3000000 tsĂŒklis=5)
                                       Baki: 65536  Partiid: 256  MĂ€lu kasutus: 3840kB
                                       ->  Parallel Seq Scan on orders  (kulud=0.00..313722.45 read=3750045 laius=20) (tegelik aeg=0.029..995.948 read=3000000 tsĂŒklis=5)
 Planeerimise aeg: 0.977 ms
 TĂ€itmise aeg: 7923.770 ms

KĂŒsimus 12 TPC-H nĂ€itab selgelt parallelset rĂ€sivĂ”rku. Iga tööprotsess osaleb ĂŒhise rĂ€sitabeli loomisel.

Ühendamine koondamisega — Merge Join

Ühendamine koondamisega on olemuselt mitteparalleelne. Ära muretse, kui see on pĂ€ringu viimane etapp, — see vĂ”ib ikkagi toimuda paralleelselt.

-- Küsimus 2 TPC-H-st
selgita (kulud välja) vali s_acctbal, s_name, n_name, p_partkey, p_mfgr, s_address, s_phone, s_comment
part, supplier, partsupp, nation, region
kus
		p_partkey = ps_partkey
		ja s_suppkey = ps_suppkey
		ja p_size = 36
		ja p_type nagu '%BRASS'
		ja s_nationkey = n_nationkey
		ja n_regionkey = r_regionkey
		ja r_name = 'AMERICA'
		ja ps_supplycost = (
			vali
			min(ps_supplycost)
			partsupp, supplier, nation, region
			kus
			p_partkey = ps_partkey
			ja s_suppkey = ps_suppkey
			ja s_nationkey = n_nationkey
			ja n_regionkey = r_regionkey
			ja r_name = 'AMERICA'
		)
järjestus s_acctbal desc, n_name, s_name, p_partkey
PIIRANG 100;
			KÜSIMUSE PLANEERIMINE
----------------------------------------------------------------------------------------------------------
 Piirang
   -&gt;  Sort
         Sort Key: supplier.s_acctbal DESC, nation.n_name, supplier.s_name, part.p_partkey
         -&gt;  Merge Join
               Merge Cond: (part.p_partkey = partsupp.ps_partkey)
               Join Filter: (partsupp.ps_supplycost = (Alluvusplaan 1))
               -&gt;  Koguge Merged
                     Plaanitud Töötajad: 4
                     -&gt;  Paralleelne Indeksi Skaneerimine kasutades <strong>part_pkey</strong> os part
                           Filter: (((p_type)::text ~~ '%BRASS'::text) JA (p_size = 36))
               -&gt;  Materjaliseerimise
                     -&gt;  Sorteerimine
                           Sort Key: partsupp.ps_partkey
                           -&gt;  Sisejõud
                                 -&gt;  Sisejõud
                                       Join Filter: (nation.n_regionkey = region.r_regionkey)
                                       -&gt;  Seq Scan on region
                                             Filter: (r_name = 'AMERICA'::bpchar)
                                       -&gt;  Hash Join
                                             Hash Cond: (supplier.s_nationkey = nation.n_nationkey)
                                             -&gt;  Seq Scan on supplier
                                             -&gt;  Hash
                                                   -&gt;  Seq Scan on nation
                                 -&gt;  Indeksi Skaneerimine kasutades idx_partsupp_suppkey on partsupp
                                       Index Cond: (ps_suppkey = supplier.s_suppkey)
               Alluvusplaan 1
                 -&gt;  Agregaat
                       -&gt;  Sisejõud
                             Join Filter: (nation_1.n_regionkey = region_1.r_regionkey)
                             -&gt;  Seq Scan on region region_1
                                   Filter: (r_name = 'AMERICA'::bpchar)
                             -&gt;  Sisejõud
                                   -&gt;  Sisejõud
                                         -&gt;  Indeksi Skaneerimine kasutades idx_partsupp_partkey on partsupp partsupp_1
                                               Index Cond: (part.p_partkey = ps_partkey)
                                         -&gt;  Indeksi Skaneerimine kasutades supplier_pkey on supplier supplier_1
                                               Index Cond: (s_suppkey = partsupp_1.ps_suppkey)
                                   -&gt;  Indeksi Skaneerimine kasutades nation_pkey on nation nation_1
                                         Index Cond: (n_nationkey = supplier_1.s_nationkey)

Noode „Merge Join” asub „Gather Merge” kohal. Seega koondamine ei kasuta paralleelset töötlemist. Kuid noode „Parallel Index Scan” aitab siiski segmendi puhul. part_pkey.

Jaotiste kaupa ĂŒhendamine

PostgreSQL 11-s jaotiste kaupa ĂŒhendamine on vaikimisi keelatud: sellel on vĂ€ga kulukas planeerimine. Sarnaste jaotistega tabeleid saab ĂŒhendama jaotiste kaupa. Nii kasutab Postgres vĂ€iksemaid rĂ€sitabelid. Iga jaotise ĂŒhendamine vĂ”ib olla paralleelne.

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)

Peamine on see, et jaotiste kaupa ĂŒhendamine toimub paralleelselt vaid siis, kui need jaotised on piisavalt suured.

Paralleelne lisamine — Parallel Append

Parallel Append vÔib kasutada erinevate plokkide jaoks erinevates tööprotsessides. Seda esineb tavaliselt UNION ALL pÀringutes. Puuduseks on vÀiksem paralleelsus, kuna iga tööprotsess töötleb vaid 1 pÀringut.

KĂ€imas on 2 tööprotsessi, kuigi sisse on lĂŒlitatud 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   Parallel Append
         ->  Aggregate
               ->  Seq Scan on lineitem
                     Filter: (l_shipdate   Aggregate
               ->  Seq Scan on lineitem lineitem_1
                     Filter: (l_shipdate <= '1998-08-18 00:00:00'::timestamp without time zone)

KÔige olulisemad muutujad

  • WORK_MEM piirab mĂ€lu kogust iga protsessi jaoks, mitte ainult pĂ€ringute jaoks: work_mem protsessid ĂŒhendused = vĂ€ga suur mĂ€lukasutus.
  • max_parallel_workers_per_gather — kui palju tööprotsesse kasutatav programm kasutab paralleelse töötlemise jaoks plaanis.
  • max_worker_processes — kohandab töötavate protsesside koguarvu serveri CPU sĂŒdamike arvu pĂ”hjal.
  • max_parallel_workers — sama, kuid paralleelsete tööprotsesside jaoks.

Summary

Alates versioonist 9.6 vĂ”ivad paralleelne töötlemine oluliselt parandada keeruliste pĂ€ringute jĂ”udlust, mis skaneerivad palju ridu vĂ”i indekseid. PostgreSQL 10-s on paralleelne töötlemine vaikimisi sisse lĂŒlitatud. Ärge unustage seda vĂ€lja lĂŒlitada serverites, kus on suur OLTP koormus. JĂ€rjekorraskannid vĂ”i indeksiskannid kasutavad vĂ€ga palju ressursse. Kui te ei tee aruannet kogu andmestiku pĂ”hjal, vĂ”ib pĂ€ringute tootlikkust suurendada, lihtsalt lisades vajalikke indekseid vĂ”i kasutades Ă”iget osade jagamist.

Viidatud lingid

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster