PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

O le toʻatele o loʻo faʻaaogaina explain.tensor.ru - o la matou PostgreSQL fuafuaga fa'ata'ita'iga 'au'aunaga atonu e le o iloa se tasi o ana malosi sili - liliu se vaega faigata ona faitau o le log server...

PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili
... i totonu o se fesili matagofie fuafuaina ma faʻamatalaga faʻamatalaga mo faʻailoga o fuafuaga tutusa:

PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili
I lenei tusitusiga o le vaega lona lua o lana lipoti ile PGConf.Russia 2020 O le a ou taʻu atu ia te oe pe na faapefea ona matou faia lenei mea.

O le faʻamatalaga o le vaega muamua, faʻapitoa i faʻafitauli masani o faʻatinoga faʻatatau ma a latou fofo, e mafai ona maua i le tusiga "Recipes mo ma'i SQL fesili".



Muamua, tatou amata valivali - ma o le a tatou le toe valivali le fuafuaga, ua uma ona tatou valivali, ua uma ona tatou matagofie ma malamalama, ae o se talosaga.

Na foliga mai ia i matou o se "pepa" e leʻi faʻatulagaina o le talosaga na toso mai le ogalaau e foliga matua mataga ma o lea e le talafeagai.
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

Aemaise lava pe a "faʻapipiʻi" e le au atinaʻe le tino o le talosaga i le code (o le mea moni, o se antipattern, ae e tupu) i le laina e tasi. Mata'utia!

Se'i o tatou tusia lenei mea i se auala sili atu ona matagofie.
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

Ma afai e mafai ona tatou tusia lenei mea matagofie, o lona uiga, faʻamavae ma toe tuʻu faʻatasi le tino o le talosaga, ona mafai lea ona tatou "faʻapipiʻi" se faʻailoga i mea taʻitasi o lenei talosaga - o le a le mea na tupu i le tulaga tutusa i le fuafuaga.

Su'esu'e la'au syntax

Ina ia faia lenei mea, e tatau ona faʻavasega muamua le talosaga.
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

Aua ua tatou maua o le totonugalemu o le faiga e tamoe i luga o NodeJS, ona matou faia lea o se module mo ia, e te mafaia maua ile GitHub. O le mea moni, o nei mea ua faʻalauteleina "fusi" i totonu o le PostgreSQL parser lava ia. O lona uiga, o le kalama e naʻo le tuʻufaʻatasia faʻatasi ma faʻapipiʻi e faia i ai mai NodeJS. Na matou fa'aaogaina modules a isi tagata - e leai se mea lilo tele iinei.

Matou te fafagaina le tino o le talosaga e fai ma faʻaoga i la matou galuega - i le gaioiga matou te maua ai se laau faʻapipiʻiina i foliga o se mea JSON.
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

O lea la e mafai ona tatou tamomoe i totonu o lenei laau i le itu faafeagai ma tuufaatasia se talosaga ma indents, valivali, ma faatulagaga tatou te mananao ai. Leai, e le mafai ona faʻatulagaina, ae na foliga mai ia i matou o le a faigofie.
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

Fa'afanua fesili ma nodes fuafuaga

Se'i o tatou va'ai pe fa'afefea ona tatou tu'ufa'atasia le fuafuaga na tatou su'esu'eina i le laasaga muamua ma le fesili na tatou iloiloina i le lona lua.

Se'i fai se fa'ata'ita'iga faigofie - e iai sau fesili e fa'atupuina ai se CTE ma faitau fa'alua mai ai. Na te faia se fuafuaga faapena.
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

CTE

Afai e te va'ai toto'a i ai, e o'o i le version 12 (po'o le amata mai lea i le upu autu MATERIALIZED) fa'avae O le CTE ose pa pupuni mo le tagata fai fuafuaga.
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

O lona uiga afai tatou te vaʻai i se faʻasologa o le CTE i se mea i le talosaga ma se node i se mea i le fuafuaga CTE, ona mautinoa ai lea o nei nodes e "tau" le tasi ma le isi, e mafai ona tatou faʻapipiʻiina vave.

Fa'afitauli ile fetu: E mafai ona fa'aputuga CTEs.
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili
O lo'o i ai ni fa'aputuga leaga, ma e o'o lava i igoa e tasi. Mo se faʻataʻitaʻiga, e mafai i totonu CTE A faia CTE X, ma i le tulaga tutusa i totonu CTE B toe fai CTE X:

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

A faʻatusatusa, e tatau ona e malamalama i lenei mea. O le malamalama i lenei mea "i ou mata" - e oʻo lava i le vaʻaia o le fuafuaga, e oʻo lava i le vaʻaia o le tino o le talosaga - e matua faigata lava. Afai e lavelave lau fa'atupulaga CTE, fa'anofo, ma e tele talosaga, ona matua'i le iloa lea.

UNION

Afai ei ai sa matou upu autu i le fesili UNION [ALL] (operator o le tuʻufaʻatasia o faʻataʻitaʻiga e lua), ona i ai lea i le fuafuaga e fetaui ma se node Append, po o nisi Recursive Union.
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

O le mea "luga" i luga UNION - o le tupuaga muamua lea o la tatou node, lea e "lalo" - o le lona lua. Afai e uia UNION e tele a matou poloka "fa'apipi'i" i le taimi e tasi, ona Append-o le a naʻo le tasi le node, ae o le a le lua, ae tele tamaiti - i le faasologa latou te o ai, i le faasologa:

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

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

Fa'afitauli ile fetu: totonu ole fa'ata'ita'iga fa'ata'ita'iga (WITH RECURSIVE) e mafai foi ona sili atu ma le tasi UNION. Ae na'o le poloka mulimuli pe a uma le mea mulimuli e masani lava ona toe fa'afo'i UNION. O mea uma i luga e tasi, ae ese UNION:

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

E manaʻomia foʻi ona e "tumau" ia faʻataʻitaʻiga. I lenei faʻataʻitaʻiga tatou te vaʻai i lena mea UNION-e 3 vaega i la matou talosaga. E tusa ai, tasi UNION соответствует Append-node, ma le isi - Recursive Union.
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

Fa'amatalaga faitau-tusi

Ua uma ona faataoto mea uma, o lea ua tatou iloa po o fea le vaega o le talosaga e fetaui ma le fea vaega o le fuafuaga. Ma i totonu o nei vaega e mafai ona faigofie ma masani ona maua na mea e "mafai ona faitau".

Mai se manatu o fesili, matou te le iloa pe o se laulau poʻo se CTE, ae o loʻo faʻatulagaina e le node lava e tasi RangeVar. Ma e tusa ai ma le "faitau faitau", o se seti faʻatapulaʻaina foʻi o nodes:

  • 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]

Matou te iloa le fausaga o le fuafuaga ma le fesili, matou te iloa le fesoʻotaʻiga o poloka, matou te iloa igoa o mea faitino - matou te faia se faʻatusatusaga tasi-i-tasi.
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

Toe foi galuega "ma se fetu". Matou te ave le talosaga, faʻatino, e leai ni a matou igoa - matou te faitau faalua mai le CTE tutusa.
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

Tatou tilotilo i le fuafuaga-o le a le faafitauli? Aisea na maua ai se tatou igoa? Matou te le'i okaina. O fea na te maua ai sea “numera numera”?

PostgreSQL faʻaopoopoina ia lava. E tatau lava ona e malamalama i lena mea na'o se igoa fa'apea mo i matou, mo le faʻamoemoega o le faʻatusatusaina ma le fuafuaga, e leai se uiga, e faʻaopoopoina iinei. Aua neʻi o tatou uaʻi atu iā te ia.

Le lua galuega "ma se fetu": afai tatou te faitau mai se laulau vaeluaga, ona tatou maua lea o se node Append poʻo Merge Append, lea o le a aofia ai se numera tele o "tamaiti", ma o ia mea taitasi o le a i ai Scan'om mai le laulau-vaega: Seq Scan, Bitmap Heap Scan poʻo Index Scan. Ae, i soʻo se tulaga, o nei "tamaiti" o le a le o ni fesili lavelave - o le auala lea e mafai ai ona iloagofie nei pona mai Append i UNION.
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

Matou te malamalama foi i ia nonoa, aoina i latou "i le faaputuga tasi" ma fai atu: "o mea uma e te faitau mai i le megatable o loʻo i lalo ma lalo o le laau".

"Fa'afaigofie" fa'amatalaga maua nodes

PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

Values Scan fetaui i le fuafuaga VALUES i le talosaga.

Result o se talosaga e aunoa ma FROM pei SELECT 1. Pe a iai sau fa'amatalaga sese ma le loto i ai WHERE-poloka (ona aliali mai lea o le uiga 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 "faafanua" i le SRF o le igoa tutusa.

Ae fa'atasi ai ma fesili fa'amomoli e sili atu ona lavelave mea uma - o le mea e leaga ai, e le o taimi uma e liliu ai InitPlan/SubPlan. O nisi taimi latou te liliu atu i ... Join poʻo ... Anti Join, aemaise pe a e tusia se mea faapena WHERE NOT EXISTS .... Ma o iinei e le mafai i taimi uma ona tuʻufaʻatasia - i totonu o le tusiga o le fuafuaga e leai ni faʻalapotopotoga e fetaui ma nodes o le fuafuaga.

Toe foi galuega "ma se fetu": nisi VALUES i le talosaga. I lenei tulaga ma i le fuafuaga o le ae mauaina ni nai nodes Values Scan.
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

"Numera" suffix o le a fesoasoani e iloagofie ai mai le tasi ma le isi - e faʻaopoopo tonu i le faasologa o loʻo maua ai mea tutusa. VALUES- poloka i luga o le talosaga mai luga i lalo.

Faʻagasologa o faʻamatalaga

E foliga mai o mea uma o loʻo i totonu o la matou talosaga ua uma ona faʻavasega - pau le mea o totoe Limit.
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

Ae o iinei e faigofie mea uma - e pei o nodes Limit, Sort, Aggregate, WindowAgg, Unique “faafanua” tasi-i-le tasi i le faagaoioiga talafeagai i le talosaga, pe afai latou i ai iina. E leai ni "fetu" po o ni faigata iinei.
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

AUAI

E tulai mai faigata pe a tatou mananao e tuufaatasi JOIN i lo latou va. E le o taimi uma e mafai ai, ae e mafai.
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

Mai le vaaiga a le parser fesili, o loʻo i ai le matou node JoinExpr, lea e to'alua tonu lana fanau - agavale ma taumatau. O le mea lea, e tusa ai, o le mea lea o loʻo i luga "luga" o lau JOIN ma le mea o loʻo tusia "lalo" i le talosaga.

Ma mai le vaaiga o le fuafuaga, o i latou nei e toalua e tupuga mai i nisi * Loop/* Join-node. Nested Loop, Hash Anti Join,... - se mea faapena.

Seʻi o tatou faʻaogaina manatu faigofie: afai ei ai a tatou laulau A ma B e "auai" le tasi i le isi i le fuafuaga, ona mafai lea ona maua i le talosaga. A-JOIN-B, po o B-JOIN-A. Sei o tatou taumafai e tuufaatasi le auala lea, sei o tatou taumafai e tuufaatasi le isi itu, ma faapena ai lava seia uma a tatou paga faapea.

Se'i ave la tatou sintax tree, ave la tatou fuafuaga, va'ai i latou... e le tutusa!
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

Tatou toe tusi i foliga o kalafi - oka, ua foliga mai o se mea!
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

Se'i matau o lo'o iai a tatou nodes e iai le fanau B ma le C i le taimi e tasi - tatou te le popole i le fa'asologa. Sei o tatou tuufaatasia ma liliu le ata o le node.
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

Sei o tatou toe vaavaai. O lea ua iai a matou nodes ma tamaiti A ma paga (B + C) - e fetaui ma latou.
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

Matagofie! E aliali mai o i ma’ua ia e to’alua JOIN mai le talosaga ma nodes o le fuafuaga na tuufaatasia ma le manuia.

Talofa e, e le o taimi uma e foia ai lenei faafitauli.
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

Mo se faʻataʻitaʻiga, pe a fai i se talosaga A JOIN B JOIN C, ma i totonu o le fuafuaga, muamua lava, na fesoʻotaʻi ai le "fafo" pona A ma le C. Ae e leai se faʻalapotopotoga faʻapitoa i le talosaga, e leai se mea matou te faʻamaonia, leai se mea e faʻapipiʻi ai se faʻailoga. E tutusa lava ma le "koma" pe a e tusitusi A, B.

Ae, i le tele o tulaga, toetoe lava o pona uma e mafai ona "talanoa" ma e mafai ona e mauaina lenei ituaiga faʻamatalaga i le agavale i le taimi - moni, pei o Google Chrome pe a e suʻeina le code JavaScript. E mafai ona e vaʻai pe o le a le umi o laina taʻitasi ma faʻamatalaga taʻitasi e "faʻatino."
PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

Ma ina ia sili atu ona faigofie mo oe le faʻaogaina o nei mea uma, ua matou faia le teuina fa'amaumauga, lea e mafai ona e fa'asaoina ma maua mulimuli ane au fuafuaga fa'atasi ai ma talosaga fa'atasi pe fa'asoa atu le so'otaga i se tasi.

Afai e te manaʻomia le aumaia o se fesili e le mafai ona faitau i totonu o se pepa talafeagai, faʻaoga tatou "normalizer".

PostgreSQL Query Profiler: faʻafefea ona faʻafetaui fuafuaga ma fesili

puna: www.habr.com

Faaopoopo i ai se faamatalaga