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...
... ki roto i tetahi uiuinga tino ataahua me nga tohu horopaki mo nga waahanga mahere e pa ana:
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
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
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.
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.
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.
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.
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!
Me tuhi ano ki te ahua kauwhata - aue, he ahua kee!
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.
Kia titiro ano tatou. Inaianei kei a matou nga pona me nga tamariki A me nga takirua (B + C) - he hototahi ki a raatau.
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.
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."
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".