ProHoster > Блог > Nchịkwa > Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ
Ọtụtụ ndị na-eji kọwaa.tensor.ru - ọrụ nhụta atụmatụ PostgreSQL anyị nwere ike ọ gaghị ama otu n'ime ike ya - na-atụgharị mpempe akwụkwọ nkesa nke siri ike ịgụ ...
... n'ime ajụjụ a haziri nke ọma nke nwere ntụnye okirikiri maka ọnụ ọnụ atụmatụ dabara adaba:
N'ime edemede a nke akụkụ nke abụọ nke ya akụkọ na PGConf.Russia 2020 Aga m agwa gị otu anyị siri mee nke a.
Enwere ike ịchọta ederede nke akụkụ nke mbụ, nke a raara nye na nsogbu arụmọrụ ajụjụ na-ahụkarị na ngwọta ha, na akụkọ "Ntụziaka maka ajụjụ SQL na-arịa ọrịa".
Nke mbụ, ka anyị malite ịcha agba - na anyị agaghịzi agba agba atụmatụ ahụ, anyị agbachaala ya, anyị enweelarị ya mara mma na nghọta, mana arịrịọ.
Ọ dị anyị ka site na "akwụkwọ mpempe akwụkwọ" a na-enweghị nhazi, arịrịọ a na-adọta na log na-ele anya nke ọma na ya mere adịghị mma.
Karịsịa mgbe ndị mmepe "gwara" ahụ nke arịrịọ na koodu (nke a bụ, n'ezie, ihe mgbochi, ma ọ na-eme) n'otu ahịrị. jọgburu onwe ya!
Ka anyị see nke a n'ụzọ mara mma karịa.
Ma ọ bụrụ na anyị nwere ike ise nke a mara mma, ya bụ, kewaa ma na-ejikọta ọnụ nke arịrịọ ahụ, mgbe ahụ, anyị nwere ike "tinye" ihe ngosi n'ihe ọ bụla nke arịrịọ a - ihe mere n'oge kwekọrọ na atụmatụ ahụ.
Ajụjụ syntax osisi
Iji mee nke a, a ga-ebu ụzọ tugharịa arịrịọ ahụ.
N'ihi na anyị nwere isi nke usoro na-agba ọsọ na NodeJS, mgbe ahụ, anyị mere modul maka ya, ị nwere ike chọta ya na GitHub. N'ezie, ndị a na-agbatị "njikọ" na internals nke PostgreSQL parser n'onwe ya. Ya bụ, ụtọasụsụ ahụ bụ naanị ọnụọgụ abụọ achịkọtara wee mee njikọ na ya site na NodeJS. Anyị weere modul ndị ọzọ dị ka ihe ndabere - ọ dịghị nnukwu nzuzo ebe a.
Anyị na-eri nri ahụ nke arịrịọ dị ka ntinye aka na ọrụ anyị - na mmepụta anyị na-enweta osisi syntax parsed n'ụdị ihe JSON.
Ugbu a, anyị nwere ike ịgbapụ n'osisi a n'akụkụ nke ọzọ wee gbakọọ arịrịọ na indents, agba, na nhazi nke anyị chọrọ. Mba, nke a abụghị nhazi, mana ọ dị anyị ka nke a ga-adaba adaba.
Ajụjụ ịse eserese na ọnụ atụmatụ
Ugbu a, ka anyị hụ otú anyị nwere ike isi jikọta atụmatụ anyị tụlere na nke mbụ na ajụjụ anyị tụlere na nke abụọ.
Ka anyị were ọmụmaatụ dị mfe - anyị nwere ajụjụ na-ewepụta CTE wee gụọ ya ugboro abụọ. Ọ na-emepụta atụmatụ dị otú ahụ.
Nke a pụtara na ọ bụrụ na anyị ahụ otu ọgbọ CTE ebe na arịrịọ na ọnụ ebe na atụmatụ CTE, Mgbe ahụ ọnụ ụzọ ndị a maa "na-alụ ọgụ" na ibe ha, anyị nwere ike jikọta ha ozugbo.
Nsogbu dị na akara mmuke: Enwere ike itinye CTE.
Enwere ndị akwụghị nke ọma, na ọbụna ndị nwere otu aha. Dịka ọmụmaatụ, ị nwere ike ime CTE A ime CTE X, na n'otu ọkwa n'ime CTE B mee ya ọzọ CTE X:
WITH A AS (
WITH X AS (...)
SELECT ...
)
, B AS (
WITH X AS (...)
SELECT ...
)
...
Mgbe ị na-atụnyere, ị ga-aghọta nke a. Ịghọta nke a "na anya gị" - ọbụna ịhụ atụmatụ ahụ, ọbụna ịhụ ahụ nke arịrịọ ahụ - siri ike. Ọ bụrụ na ọgbọ CTE gị dị mgbagwoju anya, akwụ ụgwọ, na arịrịọ ndị ahụ buru ibu, mgbe ahụ ọ bụ ihe amaghị ihe ọ bụla.
Union
Ọ bụrụ na anyị nwere isiokwu na ajụjụ UNION [ALL] (onye na-arụ ọrụ nke ijikọta ihe atụ abụọ), mgbe ahụ na atụmatụ ọ dabara ma ọ bụ ọnụ Append, ma ọ bụ ụfọdụ Recursive Union.
Nke ahụ bụ "n'elu" n'elu UNION - nke a bụ nwa mbụ nke ọnụ anyị, nke dị "n'okpuru" - nke abụọ. Ọ bụrụ na site na UNION anyị nwere ọtụtụ ngọngọ "glued" otu mgbe, mgbe ahụ Append-a ka ga-enwe naanị otu ọnụ, ma ọ gaghị enwe abụọ, ma ọtụtụ ụmụaka - n'usoro ha na-aga, n'otu n'otu:
(...) -- #1
UNION ALL
(...) -- #2
UNION ALL
(...) -- #3
Append
-> ... #1
-> ... #2
-> ... #3
Nsogbu dị na akara mmuke: n'ime recursive sampling generation (WITH RECURSIVE) nwekwara ike ịbụ ihe karịrị otu UNION. Mana ọ bụ naanị ngọngọ ikpeazụ mgbe nke ikpeazụ gachara na-emegharịghachi mgbe niile UNION. Ihe niile dị n'elu bụ otu, ma dị iche iche UNION:
WITH RECURSIVE T AS(
(...) -- #1
UNION ALL
(...) -- #2, тут кончается генерация стартового состояния рекурсии
UNION ALL
(...) -- #3, только этот блок рекурсивный и может содержать обращение к T
)
...
I kwesịkwara inwe ike 'ịrapawa' ihe atụ ndị dị otú ahụ. N'ihe atụ a, anyị na-ahụ nke ahụ UNION- e nwere akụkụ 3 na arịrịọ anyị. N'ihi ya, otu UNION kwekọrọ Append- ọnụ, na ndị ọzọ - Recursive Union.
Gụọ-dee data
Edebere ihe niile, ugbu a, anyị maara nke mpempe akwụkwọ ahụ kwekọrọ na nke atụmatụ ahụ. Na n'ime iberibe ndị a, anyị nwere ike ịchọta ihe ndị ahụ "nwere ike ịgụ".
Site n'echiche ajụjụ, anyị amaghị ma ọ bụ tebụl ma ọ bụ CTE, mana a na-ahọpụta ha site na otu ọnụ. RangeVar. Na n'ihe gbasara “agụmagụ”, nke a bụkwa ọnụọgụ ọnụ nwere oke:
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]
Anyị maara nhazi nke atụmatụ na ajụjụ, anyị maara akwụkwọ ozi nke blocks, anyị maara aha ihe ndị ahụ - anyị na-eme ntụnyere otu na otu.
Ọzọ ọrụ "na akara mmuke". Anyị na-ewere arịrịọ ahụ, mebie ya, anyị enweghị aha aha - anyị na-agụ ya ugboro abụọ site na otu CTE.
Anyị na-ele anya na atụmatụ - gịnị bụ nsogbu? Gịnị mere anyị ji nwee utu aha? Anyị enyeghị ya iwu. Ebee ka ọ ga-enweta "nọmba nọmba" dị otú ahụ?
PostgreSQL na-agbakwụnye ya n'onwe ya. Naanị ị ga-aghọta nke ahụ dị nnọọ otú ahụ utu aha n'ihi na anyị, n'ihi na nzube nke ntụnyere na atụmatụ, ọ dịghị eme ka ọ bụla uche, ọ na-nanị kwukwara ebe a. Ka anyị ghara ịṅa ntị n'ebe ọ nọ.
Nke abụọ ọrụ "na akara mmuke": ọ bụrụ na anyị na-agụ site na tebụl nkewa, mgbe ahụ, anyị ga-enweta ọnụ Append ma ọ bụ Merge Append, nke ga-agụnye ọnụ ọgụgụ buru ibu nke "ụmụaka", nke ọ bụla n'ime ha ga-abụkwa n'ụzọ ụfọdụ Scan'om si na tebụl-ngalaba: Seq Scan, Bitmap Heap Scan ma ọ bụ Index Scan. Ma, n'ọnọdụ ọ bụla, "ụmụaka" ndị a agaghị abụ ajụjụ mgbagwoju anya - nke a bụ otú e nwere ike isi mata ọdịiche ndị a. Append na UNION.
Anyị na-aghọtakwa ụdọ ndị dị otú ahụ, na-anakọta ha "n'otu ikpo" wee sị:"ihe niile ị na-agụ si megatable bụ ebe a na ala osisi".
"Mfe" data na-anata ọnụ
Values Scan kwekọrọ na atụmatụ VALUES na arịrịọ.
Result bụ arịrịọ na-enweghị FROM dị ka SELECT 1. Ma ọ bụ mgbe ị na-ama ụma ụgha okwu na WHERE-block (mgbe ahụ njirimara pụtara One-Time Filter):
EXPLAIN ANALYZE
SELECT * FROM pg_class WHERE FALSE; -- или 0 = 1
Ma na nested ajụjụ, ihe niile na-esiwanye mgbagwoju anya - ọ dị mwute ikwu, ha adịghị atụgharị mgbe niile InitPlan/SubPlan. Mgbe ụfọdụ, ha na-atụgharị n'ime ... Join ma ọ bụ ... Anti Join, karịsịa mgbe ị na-ede ihe dị ka WHERE NOT EXISTS .... Na ebe a, ọ bụghị mgbe niile ka ọ ga-ekwe omume ijikọta ha - na ederede nke atụmatụ ahụ ọ dịghị ndị na-arụ ọrụ kwekọrọ na ọnụ ọgụgụ nke atụmatụ ahụ.
Ọzọ ọrụ "na akara mmuke": ụfọdụ VALUES na arịrịọ. N'okwu a na na atụmatụ ị ga-enweta ọtụtụ ọnụ Values Scan.
Suffixes "ọnụọgụ" ga-enyere aka ịmata ọdịiche dị n'etiti ha na ibe - a na-agbakwunye ha kpọmkwem n'usoro e si achọta ndị kwekọrọ. VALUES-blocks tinyere arịrịọ site n'elu ruo ala.
Nhazi data
Ọ dị ka edoziri ihe niile dị na arịrịọ anyị - naanị ihe fọdụrụ bụ Limit.
Ma ebe a ihe niile dị mfe - ndị dị otú ahụ ọnụ dị ka Limit, Sort, Aggregate, WindowAgg, Unique “map” otu-na-otu nye ndị ọrụ kwekọrọ na arịrịọ ahụ, ọ bụrụ na ha nọ ebe ahụ. Enweghị "kpakpando" ma ọ bụ ihe isi ike ebe a.
BỤ
Ihe isi ike na-ebilite mgbe anyị chọrọ ikpokọta JOIN n'etiti onwe ha. Nke a anaghị ekwe omume mgbe niile, mana ọ ga-ekwe omume.
Site n'echiche nke nzacha ajụjụ, anyị nwere ọnụ JoinExpr, nke nwere kpọmkwem ụmụ abụọ - aka ekpe na aka nri. Nke a, ya mere, bụ ihe dị "n'elu" JOIN gị yana ihe edere "n'okpuru" ya na arịrịọ.
Na site n'echiche nke atụmatụ, ndị a bụ ụmụ abụọ nke ụfọdụ * Loop/* Join- ọnụ. Nested Loop, Hash Anti Join,... - ihe dị otú ahụ.
Ka anyị jiri mgbagha dị mfe: ọ bụrụ na anyị nwere tebụl A na B na-ejikọta ibe ha na atụmatụ ahụ, mgbe ahụ, na arịrịọ ha nwere ike ịchọta ma ọ bụ. A-JOIN-B, ma ọ bụ B-JOIN-A. Ka anyị gbalịa ijikọta ụzọ a, ka anyị gbalịa ikpokọta ụzọ ọzọ, na ihe ndị ọzọ ruo mgbe anyị na-agwụ na ụzọ abụọ dị otú ahụ.
Ka anyị were osisi syntax anyị, were atụmatụ anyị, lee ha anya... ọ bụghị yiri ya!
Ka anyị degharịa ya n'ụdị eserese - oh, ọ dịlarị ka ihe!
Ka anyị mara na anyị nwere ọnụ nke nwere ụmụaka B na C n'otu oge - anyị achọghị ịma n'usoro. Ka anyị jikọta ha ma tụgharịa foto ọnụ ọnụ.
Ka anyị leba anya ọzọ. Ugbu a, anyị nwere ọnụ na ụmụaka A na abụọ (B + C) - dakọtara na ha kwa.
Nnukwu! Ọ na-apụta na anyị bụ ndị a abụọ JOIN site na arịrịọ ahụ na ọnụ ọnụ atụmatụ jikọtara nke ọma.
Ewoo, a naghị edozi nsogbu a mgbe niile.
Dịka ọmụmaatụ, ọ bụrụ na arịrịọ A JOIN B JOIN C, na na atụmatụ ahụ, nke mbụ, a na-ejikọta ọnụ "mpụta" A na C. Ma ọ dịghị onye na-arụ ọrụ dị otú ahụ na arịrịọ ahụ, anyị enweghị ihe ọ bụla iji mee ka ọ pụta ìhè, ọ dịghị ihe ọ bụla iji tinye ihe ngosi. Ọ bụ otu ihe ahụ na "rịkọm" mgbe ị na-ede A, B.
Ma, n'ọtụtụ ọnọdụ, ihe fọrọ nke nta ka ọ bụrụ ọnụ ọgụgụ niile nwere ike "ịtọghe" ma ị nwere ike nweta ụdị profaịlụ a n'aka ekpe n'oge - n'ụzọ nkịtị, dị ka Google Chrome mgbe ị na-enyocha koodu JavaScript. Ị nwere ike ịhụ ogologo ahịrị nke ọ bụla na nkwupụta ọ bụla were iji "mezue."
Na ime ka ọ dịkwuo mfe maka iji ihe a niile, anyị emeela nchekwa ebe ndebe akwụkwọ, ebe ị nwere ike ịchekwa ma mesịa chọta atụmatụ gị yana arịrịọ metụtara ma ọ bụ kesaa njikọ ahụ na mmadụ.
Ọ bụrụ na ịchọrọ iweta ajụjụ a na-agụghị agụ n'ụdị zuru oke, jiri "Normalizer" anyị.