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ụ ...

Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ
... n'ime ajụjụ a haziri nke ọma nke nwere ntụnye okirikiri maka ọnụ ọnụ atụmatụ dabara adaba:

Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ
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.
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

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.
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

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ụ.
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

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.
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

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.
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

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ụ.
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

CTE

Ọ bụrụ na ị na-ele ya nke ọma, ruo ụdị 12 (ma ọ bụ malite na ya na isiokwu MATERIALIZED) nhazi CTE bụ ihe mgbochi zuru oke maka onye nhazi.
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

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.
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ
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.
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

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.
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

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.
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

Ọ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.
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

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.
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

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ụ

Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

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

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 “map” nye ndị SRF nke otu aha ahụ.

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.
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

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.
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

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.
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

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.
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

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!
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

Ka anyị degharịa ya n'ụdị eserese - oh, ọ dịlarị ka ihe!
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

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ụ.
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

Ka anyị leba anya ọzọ. Ugbu a, anyị nwere ọnụ na ụmụaka A na abụọ (B + C) - dakọtara na ha kwa.
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

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.
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

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."
Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

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ị.

Profaịlụ ajụjụ PostgreSQL: otu esi kwekọọ atụmatụ na ajụjụ

isi: www.habr.com

Tinye a comment