PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

Ba bangata ba seng ba ntse ba sebelisa hlalosa.tensor.ru - Ts'ebeletso ea rona ea pono ea leano la PostgreSQL e kanna ea se tsebe e 'ngoe ea matla a eona a maholo - ho fetolela karolo e thata ho bala ea log ea seva ...

PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso
... ho potso e entsoeng ka bokhabane e nang le lintlha tsa maemo bakeng sa libaka tse tsamaellanang tsa moralo:

PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso
Sengoloa sena sa karolo ea bobeli ea hae tlaleha ho PGConf.Russia 2020 Ke tla u bolella hore na re khonne ho etsa sena joang.

Sengoloa sa karolo ea pele, se inehetseng ho mathata a tloaelehileng a ts'ebetso ea lipotso le tharollo ea bona, se ka fumanoa sengolong. "Lipehelo tsa lipotso tsa SQL tse kulang".



Ntlha ea pele, a re qaleng ho kenya mebala - 'me re ke ke ra hlola re mebala le moralo, re se re ntse re e mebala, re se re ntse re e-na le eona e ntle le e utloisisoang, empa kopo.

Ho rona ho ne ho bonahala eka ka "lakane" e sa tsitsang kopo e huloang ho log e shebahala e le mpe haholo 'me ka hona e sa thabise.
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

Haholo-holo ha baetsi ba "khomarela" 'mele oa kopo ka khoutu (ena, ha e le hantle, ke antipattern, empa e etsahala) moleng o le mong. E nyarosang!

Ha re takang sena ka bokhabane ka tsela e itseng.
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

'Me haeba re ka taka sena ka bokhabane, ke hore, ho qhaqholla le ho khutlisetsa 'mele oa kopo, joale re ka "hokela" leseli ho ntho e' ngoe le e 'ngoe ea kopo ena - se etsahetseng sebakeng se lumellanang le morero.

Potso sefate sa syntax

Ho etsa sena, kopo e tlameha ho hlalosoa pele.
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

Hobane re na le motheo oa tsamaiso o sebetsa ho NodeJS, joale re e etselitse module, u ka khona e fumane ho GitHub. Ha e le hantle, tsena ke "litlamo" tse atolositsoeng ho basebetsi ba ka hare ho PostgreSQL parser ka boeona. Ke hore, sebōpeho-puo se hlophisitsoe feela ka mokhoa oa binary 'me ho tlamahanngoa ho eona ho tsoa ho NodeJS. Re nkile li-module tsa batho ba bang e le motheo - ha ho na sephiri se seholo mona.

Re fepa 'mele oa kopo e le ho kenya letsoho mosebetsing oa rona - ka tlhahiso re fumana sefate sa syntax se arotsoeng ka sebopeho sa ntho ea JSON.
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

Hona joale re ka matha sefateng sena ka lehlakoreng le leng 'me ra bokella kopo ka li-indents, colouring le fomete tseo re li batlang. Che, sena ha se khonehe, empa ho rona ho ne ho bonahala eka sena se tla ba bonolo.
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

Potso ea 'mapa le li-node tsa moralo

Joale a re boneng hore na re ka kopanya moralo oo re o hlahlobileng joang mohatong oa pele le potso eo re e hlahlobileng ea bobeli.

Ha re nke mohlala o bonolo - re na le potso e hlahisang CTE mme re bala ho eona habeli. O hlahisa leano le joalo.
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

CTE

Haeba u e sheba ka hloko, ho fihlela ho mofuta oa 12 (kapa ho qala ho eona ka lebitso la sehlooho MATERIALIZED) sebopeho CTE ke tšitiso e felletseng bakeng sa moralo.
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

Sena se bolela hore haeba re bona moloko oa CTE kae-kae ka kopo le node kae-kae morerong CTE, joale li-node tsena ka sebele li "loana" le tse ling, re ka li kopanya hang-hang.

Bothata ba linaleli: Li-CTE li ka hahoa.
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso
Ho na le tse haelloang hantle haholo, esita le tse nang le mabitso a tšoanang. Ka mohlala, u ka khona ka hare CTE A etsa CTE X, le boemong bo tšoanang ka hare CTE B etsa hape CTE X:

WITH A AS (
  WITH X AS (...)
  SELECT ...
)
, B AS (
  WITH X AS (...)
  SELECT ...
)
...

Ha u bapisa, u tlameha ho utloisisa sena. Ho utloisisa sena "ka mahlo a hau" - esita le ho bona moralo, esita le ho bona 'mele oa kopo - ho thata haholo. Haeba moloko oa hau oa CTE o rarahane, o lutse, 'me likōpo li le khōlō, joale ha li tsebe letho.

UNION

Haeba re na le lebitso la sehlooho potsong UNION [ALL] (mosebetsi oa ho kopanya mehlala e 'meli), joale moralo o lumellana le node Append, kapa tse ling Recursive Union.
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

Seo se "hodimo" hodimo UNION - ena ke setloholo sa pele sa node ea rona, e "tlase" - ea bobeli. Haeba ho feta UNION re na le li-blocks tse 'maloa "tse khomaretsoeng" hang-hang, joale Append-ho ntse ho tla ba le node e le 'ngoe feela, empa e ke ke ea ba le tse peli, empa bana ba bangata - ka tatellano eo ba tsamaeang ka eona, ka ho latellana:

  (...) -- #1
UNION ALL
  (...) -- #2
UNION ALL
  (...) -- #3

Append
  -> ... #1
  -> ... #2
  -> ... #3

Bothata ba linaleli: ka hare ho recursive sampling generation (WITH RECURSIVE) hape e ka ba tse fetang bonngoe UNION. Empa ke karolo ea ho qetela feela ka mor'a ea ho qetela e lulang e ipheta UNION. Ntho e 'ngoe le e' ngoe e ka holimo ke ntho e le 'ngoe, empa e fapane UNION:

WITH RECURSIVE T AS(
  (...) -- #1
UNION ALL
  (...) -- #2, тут кончается генерация стартового состояния рекурсии
UNION ALL
  (...) -- #3, только этот блок рекурсивный и может содержать обращение к T
)
...

U boetse u hloka ho khona ho "khomarela" mehlala e joalo. Mohlala ona re bona seo UNION-ho ne ho e-na le likarolo tsa 3 kopo ea rona. Ka lebaka leo, e 'ngoe UNION e lumellana le Append-node, le ho tse ling - Recursive Union.
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

Bala-ngola lintlha

Ntho e 'ngoe le e' ngoe e behiloe, joale rea tseba hore na ke karolo efe ea kopo e lumellanang le karolo efe ea moralo. 'Me likotong tsena re ka fumana habonolo le ka tlhaho lintho tseo "tse balang".

Ho ea ka pono ea potso, ha re tsebe hore na ke tafole kapa CTE, empa ba khethiloe ke node e tšoanang. RangeVar. 'Me mabapi le "ho bala", ena hape ke sete e fokolang ea li-node:

  • Seq Scan on [tbl]
  • Bitmap Heap Scan on [tbl]
  • Index [Only] Scan [Backward] using [idx] on [tbl]
  • CTE Scan on [cte]
  • Insert/Update/Delete on [tbl]

Re tseba sebopeho sa moralo le potso, re tseba ngollano ea li-blocks, re tseba mabitso a lintho - re etsa papiso e le 'ngoe.
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

Hape mosebetsi "ka linaleli". Re nka kopo, re e phetha, ha re na li-aliases - re e balile habeli ho tsoa ho CTE e tšoanang.
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

Re sheba moralo - bothata ke eng? Ke hobane'ng ha re ne re e-na le lebitso? Ha rea ​​e laela. O fumana “nomoro” e joalo hokae?

PostgreSQL e e eketsa ka boeona. O hloka feela ho utlwisisa seo lebitso le joalo feela bakeng sa rona, ka sepheo sa ho bapisa le moralo, ha ho utloahale, ho eketsoa feela mona. Ha re mo hlokomeleng.

Ea bobeli mosebetsi "ka linaleli": haeba re bala ho tloha tafoleng e arohaneng, joale re tla fumana node Append kapa Merge Append, e tla ba le palo e kholo ea "bana", 'me e' ngoe le e 'ngoe e tla ba ka tsela e itseng Scan'om ho tsoa karolong ea tafole: Seq Scan, Bitmap Heap Scan kapa Index Scan. Empa, ho sa tsotellehe boemo leha e le bofe, "bana" bana e ke ke ea e-ba lipotso tse rarahaneng - ke kamoo li-node tsena li ka khetholloang ho tsona. Append ho UNION.
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

Re boetse re utloisisa mafito a joalo, re a bokella “ka qubu e le ’ngoe” ebe re re: “ntho e 'ngoe le e' ngoe eo u e balang ho tloha megatable e mona le tlase sefateng".

"Bonolo" lintlha tsa ho amohela lintlha

PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

Values Scan e tsamaellana le morero VALUES ka kopo.

Result ke kopo ntle le FROM mofuta oa mofuta SELECT 1. Kapa ha u na le polelo e fosahetseng ka boomo WHERE-block (joale ho hlaha tšobotsi One-Time Filter):

EXPLAIN ANALYZE
SELECT * FROM pg_class WHERE FALSE; -- или 0 = 1

Result  (cost=0.00..0.00 rows=0 width=230) (actual time=0.000..0.000 rows=0 loops=1)
  One-Time Filter: false

Function Scan "'mapa" ho li-SRF tsa lebitso le tšoanang.

Empa ka lipotso tse entsoeng sehlaheng ntho e 'ngoe le e' ngoe e rarahane le ho feta - ka bomalimabe, ha li fetohe kamehla InitPlan/SubPlan. Ka linako tse ling ba fetoha ... Join kapa ... Anti Join, haholo-holo ha u ngola ntho e kang WHERE NOT EXISTS .... 'Me mona ha ho khonehe kamehla ho li kopanya - ka mongolo oa moralo ha ho na basebetsi ba lumellanang le li-node tsa moralo.

Hape mosebetsi "ka linaleli": tse ling VALUES ka kopo. Tabeng ena le moralo o tla fumana li-node tse 'maloa Values Scan.
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

Li-suffixes "tse baloang" li tla thusa ho li khetholla ho tse ling - li eketsoa hantle ka tatellano eo tse tsamaellanang li fumanoang ka eona. VALUES-blocks hammoho le kopo ho tloha holimo ho ea tlaase.

Ts'ebetso ea data

Ho bonahala eka ntho e 'ngoe le e' ngoe kopong ea rona e lokisitsoe - ho setseng ke Limit.
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

Empa mona ntho e 'ngoe le e' ngoe e bonolo - li-node tse kang Limit, Sort, Aggregate, WindowAgg, Unique "'mapa" ka bonngoe ho basebetsi ba tsamaisanang le kopo, haeba ba le teng. Ha ho na "linaleli" kapa mathata mona.
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

ETSA

Mathata a hlaha ha re batla ho kopanya JOIN pakeng tsa bona. Sena ha se kamehla se ka khonehang, empa sea khoneha.
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

Ho ea ka pono ea mohlahlobi oa potso, re na le node JoinExpr, e nang le bana ba babeli hantle - ka ho le letšehali le ka ho le letona. Sena, ka hona, ke se "kaholimo" ho JOIN ea hau le se ngotsoeng "tlase" kopong.

'Me ho ea ka pono ea moralo, bana ke litloholo tse peli tsa ba bang * Loop/* Join-node. Nested Loop, Hash Anti Join,... - ntho e kang eo.

Ha re sebeliseng mabaka a bonolo: haeba re na le litafole A le B tse "kopanang" leanong, ka kopo li ka fumaneha A-JOIN-B, kapa B-JOIN-A. A re leke ho kopanya ka tsela ena, a re leke ho kopanya ka tsela e fapaneng, joalo-joalo ho fihlela re felloa ke lipara tse joalo.

Ha re nke sefate sa rona sa syntax, re nke moralo oa rona, re shebe ... ha re tšoane!
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

Ha re e takang bocha ka mokhoa oa li-graph - oh, e se e shebahala joalo ka ntho e itseng!
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

Ha re hlokomele hore re na le li-node tse nang le bana B le C ka nako e le 'ngoe - ha re tsotelle hore na ke tatellano efe. A re li kopanye 'me re fetole setšoantšo sa node.
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

Ha re shebeng hape. Hona joale re na le li-node tse nang le bana A le lipara (B + C) - li lumellana le tsona hape.
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

E kholo! Hoa bonahala hore re bana ba babeli JOIN ho tsoa ho kopo le li-node tsa moralo li ile tsa kopanngoa ka katleho.

Ijoo, bothata bona ha bo rarolloe kamehla.
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

Ka mohlala, haeba ho kopo A JOIN B JOIN C, 'me morerong, pele ho tsohle, li-node tsa "ka ntle" tsa A le C. Empa ha ho na mosebeletsi ea joalo ka kopo, ha re na letho leo re lokelang ho le totobatsa, ha ho letho leo re ka le kopanyang le maikutlo. Hoa tšoana le ka "koma" ha u ngola A, B.

Empa, maemong a mangata, hoo e ka bang li-node tsohle li ka "kokoloha" 'me u ka fumana mofuta ona oa profil ka letsohong le letšehali ka nako - ka ho toba, joalo ka Google Chrome ha u hlahloba khoutu ea JavaScript. U ka bona hore na mola ka mong le polelo ka 'ngoe li nkile nako e kae ho "phetha."
PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

'Me ho etsa hore ho be bonolo hore u sebelise tsena tsohle, re entse polokelo boitsebiso, moo o ka bolokang 'me hamorao oa fumana merero ea hau hammoho le likopo tse amanang le eona kapa oa arolelana sehokelo le motho e mong.

Haeba o hloka feela ho tlisa potso e sa baleheng ka foromo e lekaneng, sebelisa "normalizer" ea rona.

PostgreSQL Query Profiler: mokhoa oa ho bapisa moralo le potso

Source: www.habr.com

Eketsa ka tlhaloso