PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

He maha te hunga e whakamahi ana whakamārama.tensor.ru - kare pea ta maatau ratonga whakaata mahere PostgreSQL e mohio ki tetahi o ona mana nui - ka huri i tetahi waahanga uaua ki te panui o te raarangi tūmau...

PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai
... ki roto i tetahi uiuinga tino ataahua me nga tohu horopaki mo nga waahanga mahere e pa ana:

PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai
I roto i tenei tuhinga o te wahanga tuarua o ana pūrongo i PGConf.Russia 2020 Ka korerotia e ahau ki a koe me pehea ta matou whakahaere i tenei.

Ko te tuhinga o te waahanga tuatahi, i whakatapua ki nga raru mahi uiui me o raatau otinga, ka kitea i roto i te tuhinga "Nga tohutao mo nga patai SQL mate".



Tuatahi, me timata taatau ki te tae - a ka kore e tae atu te mahere, kua oti kee taatau ki te tae, he ataahua me te maarama, engari he tono.

Ko te ahua ki a matou na te ahua o te "pepa" kaore i whakahōputuhia te tono i tangohia mai i te raarangi he ahua kino rawa atu, na reira kaore e pai.
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

Ina koa ka "whakapiri" nga kaihanga i te tinana o te tono i roto i te waehere (koinei, he antipattern, engari ka tupu) i roto i te raina kotahi. whakamataku!

Kia ataahua ake te tuhi i tenei.
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

A, ki te taea e tatou te tuhi ataahua, ara, wetewete me te whakakotahi i te tinana o te tono, katahi ka "whakapiri" he tohu ki ia mea o tenei tono - he aha te mea i tupu i te waahi o te mahere.

Uiui rakau wetereo

Ki te mahi i tenei, me tuhi tuatahi te tono.
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

No te mea kei a tatou Ko te matua o te punaha ka rere i runga i te NodeJS, katahi ka mahia e matou he waahanga mo taua mea, ka taea e koe kitea i runga i GitHub. Inaa, he "here" enei ki nga roto o te PostgreSQL parser ake. Arā, ko te wetereo he mea whakahiato-rua noa, ka herea mai i a NodeJS. I tangohia e matou nga waahanga o etahi atu hei turanga - kaore he mea ngaro nui i konei.

Ka whangaihia e matou te tinana o te tono hei whakaurunga ki ta matou mahi - i te putanga ka whiwhi matou i te rakau wetereo kua pahemo i te ahua o te ahanoa JSON.
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

Inaianei ka taea e tatou te rere i roto i tenei rakau i te huarahi kee ka whakaemi i tetahi tono me nga nuku, tae, me te whakahōputu e hiahia ana tatou. Kao, ehara tenei i te mea whakarite, engari ki ta maatau he watea tenei.
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

Uiui mahere me nga pona mahere

Inaianei kia kite me pehea e taea ai te whakakotahi i te mahere i tātarihia e matou i te taahiraa tuatahi me te patai i tātarihia e matou i te tuarua.

Me tango he tauira ngawari - he patai kei te whakaputa i te CTE ka rua nga panui mai i a ia. Ka mahia e ia he mahere pera.
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

CTE

Mena ka ata tirohia e koe, tae atu ki te putanga 12 (ka timata mai ranei me te kupu matua MATERIALIZED) hanganga Ko te CTE he tino aukati mo te kaiwhakamahere.
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

Ko te tikanga tenei mena ka kite tatou i tetahi reanga CTE i tetahi waahi i roto i te tono me tetahi node i tetahi waahi o te mahere CTE, katahi ka "whawhai" enei pona tetahi ki tetahi, ka taea e taatau te whakakotahi tonu.

He raru ki te whetūriki: Ka taea te kohanga CTE.
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai
He tino kino nga kohanga, me etahi o te ingoa kotahi. Hei tauira, ka taea e koe ki roto CTE A hanga CTE X, me te taumata ano o roto CTE B mahia ano CTE X:

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

I te whakataurite, me mohio koe ki tenei. Ko te mohio ki tenei "ma o kanohi" - ahakoa te kite i te mahere, ahakoa te kite i te tinana o te tono - he tino uaua. Mena he uaua to reanga CTE, he kohanga, he nui hoki nga tono, kare he mohio.

UNION

Mena he kupu matua kei roto i te patai UNION [ALL] (Kaiwhakahaere mo te hono i nga tauira e rua), katahi ka rite ki te mahere ki tetahi node Append, etahi ranei Recursive Union.
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

Ko tera "i runga" i runga UNION - ko te uri tuatahi tenei o to tatou node, "i raro" - te tuarua. Mena ka puta UNION he maha nga poraka "kua whakapiri" i te wa kotahi, katahi Append-ka kotahi tonu te node, engari karekau e rua, engari he maha nga tamariki - i roto i te raupapa e haere ana:

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

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

He raru ki te whetūriki: roto whakangao tauira recursive (WITH RECURSIVE) ka taea hoki te neke atu i te kotahi UNION. Engari ko te poraka whakamutunga anake i muri i te mea whakamutunga ka recursive tonu UNION. Ko nga mea katoa o runga he kotahi, engari he rereke UNION:

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

Me kaha hoki koe ki te "piri" i enei tauira. I tenei tauira ka kite tatou i tera UNION-e 3 nga waahanga i roto i ta maatau tono. No reira, kotahi UNION соответствует Append-node, me tetahi atu - Recursive Union.
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

Raraunga panui-tuhi

Kua takoto nga mea katoa, inaianei ka mohio matou ko tehea wahi o te tono e rite ana ki tehea waahanga o te mahere. A, i roto i enei waahanga ka kitea e tatou nga mea "ka taea te panui".

Mai i te tirohanga patai, kaore matou e mohio he ripanga, he CTE ranei, engari kua tohua e te node kotahi. RangeVar. A, mo te "panui", he iti noa te huinga o nga 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]

E mohio ana matou ki te hanganga o te mahere me te patai, e mohio ana matou ki nga reta o nga poraka, e mohio ana matou ki nga ingoa o nga mea - ka whakatauhia e matou tetahi ki tetahi.
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

ano mahi "me te whetūriki". Ka tangohia e matou te tono, mahia, karekau he ingoa ingoa - ka panui noa matou i te waa mai i te CTE kotahi.
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

Ka titiro tatou ki te mahere - he aha te raru? He aha i whai ingoa ai tatou? Kaore matou i tono. Kei hea e whiwhi ai ia i taua “tau nama”?

Ka taapirihia e PostgreSQL ake. Me mohio noa koe ki tena he ingoa ingoa noa mo matou, mo te whakataurite ki te mahere, karekau he tikanga, he mea tapiri noa ki konei. Kaua tatou e aro ki a ia.

Ko te tuarua mahi "me te whetūriki": ki te panui tatou mai i te teepu wehewehe, katahi ka whiwhi tatou i te node Append ranei Merge Append, he maha nga "tamariki" kei roto, a he aha te ahua Scan'om mai i te waahanga ripanga: Seq Scan, Bitmap Heap Scan ranei Index Scan. Engari, ahakoa he aha, ehara enei "tamariki" i nga patai uaua - koinei te huarahi e wehewehe ai enei pona mai i Append i UNION.
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

Kei te mohio ano matou ki enei momo pona, kohikohia "ki te puranga kotahi" ka kii: "Ko nga mea katoa e panuihia ana e koe mai i te megatable kei konei me raro i te rakau".

"Maamaa" nga raraunga e whiwhi ana i nga waahanga

PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

Values Scan he rite ki te mahere VALUES i roto i te tono.

Result he tono kore FROM rite SELECT 1. Ina he korero teka ranei koe i roto WHERE-poraka (ka puta te huanga 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 “mahere” ki nga SRF o taua ingoa.

Engari me nga uiui kohanga he uaua ake nga mea katoa - engari, kaore e huri tonu InitPlan/SubPlan. I etahi wa ka huri ki roto ... Join ranei ... Anti Join, ina koa ka tuhi koe i tetahi mea penei WHERE NOT EXISTS .... I konei kaore e taea te whakakotahi i nga wa katoa - i roto i te tuhinga o te mahere kaore he kaiwhakahaere e rite ana ki nga waahanga o te mahere.

ano mahi "me te whetūriki": etahi VALUES i roto i te tono. I tenei keehi me te mahere ka whiwhi koe i etahi pona Values Scan.
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

Ko nga pimuri "Numbered" ka awhina ki te wehewehe i a raatau - ka taapirihia kia rite ki te raupapa e kitea ai nga mea e rite ana. VALUES-poraka i te taha o te tono mai i runga ki raro.

Te tukatuka raraunga

Te ahua nei kua whakatauhia nga mea katoa o ta matou tono - ko nga mea katoa e toe ana Limit.
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

Engari i konei he ngawari nga mea katoa - penei i nga pona Limit, Sort, Aggregate, WindowAgg, Unique “mahere” kotahi-ki-tetahi ki nga kaiwhakahaere e pa ana ki te tono, mena kei reira. Karekau he "whetu" he uauatanga ranei i konei.
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

Hono

Ka puta nga uaua ka hiahia tatou ki te whakakotahi JOIN i waenganui i a ratou ano. Kaore e taea tenei i nga wa katoa, engari ka taea.
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

Mai i te tirohanga a te kaiparohi patai, he node ta tatou JoinExpr, e rua tonu ana tamariki - maui me matau. Ko tenei, ko te mea "i runga" i to WHAKATOKANGA me te mea kua tuhia "i raro" i roto i te tono.

A, mai i te tirohanga o te mahere, e rua enei uri o etahi * Loop/* Join-node. Nested Loop, Hash Anti Join,... - he mea penei.

Me whakamahi tatou i te arorau ngawari: mena kei a maatau tepu A me B e "hono" tetahi ki tetahi i roto i te mahere, na i roto i te tono ka kitea pea. A-JOIN-B, ranei B-JOIN-A. Ka ngana tatou ki te whakakotahi i tenei huarahi, me ngana ki te whakakotahi i tetahi atu huarahi, ka pera tonu kia pau ra ano nga momo takirua.

Me tango ta tatou rakau wetereo, tango i ta tatou mahere, titiro ki a raatau... kaore e rite!
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

Me tuhi ano ki te ahua kauwhata - aue, he ahua kee!
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

Kia mahara he pona kei a tatou he tamariki B me C i te wa kotahi - kaore matou e aro ki te raupapa. Me whakakotahi ka huri i te pikitia o te node.
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

Kia titiro ano tatou. Inaianei kei a matou nga pona me nga tamariki A me nga takirua (B + C) - he hototahi ki a raatau.
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

Rawe! Ka puta ko maua enei tokorua JOIN mai i te tono me nga pona mahere i pai te whakakotahi.

Aue, kaore tenei raruraru e whakaoti i nga wa katoa.
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

Hei tauira, mena he tono A JOIN B JOIN C, a i roto i te mahere, i te tuatahi, i honoa nga "waho" nodes A me C. Engari kaore he kaiwhakahaere pera i roto i te tono, kaore he mea hei tohu, kaore he mea hei whakapiri i te tohu. He rite tonu ki te "piko" ina tuhi koe A, B.

Engari, i roto i te nuinga o nga keehi, tata katoa nga pona ka taea te "tangohia" ka taea e koe te tiki i tenei momo tohu ki te taha maui i te waa - mooni, penei i a Google Chrome ka wetewete koe i te waehere JavaScript. Ka taea e koe te kite i te roa o ia raina me ia korero ki te "whakamahi."
PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

A kia pai ake ai maau ki te whakamahi i enei mea katoa, kua hanga e matou he rokiroki pūranga, ka taea e koe te tiaki me te kimi i o mahere me nga tono e hono ana, te tiri ranei i te hono ki tetahi.

Mena ka hiahia koe ki te kawe mai i tetahi patai kaore e taea te panui ki te ahua tika, whakamahia to tatou "whakatikatika".

PostgreSQL Query Profiler: me pehea te whakarite mahere me te patai

Source: will.com

Tāpiri i te kōrero