Nyob rau hauv cov ntaub ntawv no ntawm qhov thib ob ntawm nws qhia ntawm PGConf.Russia 2020 Kuv mam li qhia koj seb peb tswj tau li cas los ua qhov no.
Cov ntawv sau tseg ntawm thawj ntu, mob siab rau cov lus nug txog cov teeb meem kev ua tau zoo thiab lawv cov kev daws teeb meem, tuaj yeem pom hauv kab lus "Recipes for ailing SQL queries".
Thiab yog tias peb tuaj yeem kos qhov no zoo nkauj, uas yog, disassemble thiab muab rov qab ua ke lub cev ntawm qhov kev thov, tom qab ntawd peb tuaj yeem "txuas" cov lus qhia rau txhua qhov khoom ntawm qhov kev thov no - dab tsi tshwm sim ntawm qhov sib thooj ntawm txoj kev npaj.
Query syntax tsob ntoo
Txhawm rau ua qhov no, qhov kev thov yuav tsum ua ntej parsed.
Vim peb muaj lub hauv paus ntawm lub system khiav ntawm NodeJS, ces peb ua ib tug module rau nws, koj ua tau nrhiav nws ntawm GitHub. Qhov tseeb, cov no tau txuas ntxiv "kev khi" rau sab hauv ntawm PostgreSQL parser nws tus kheej. Ntawd yog, cov qauv sau ntawv yog yooj yim binary compiled thiab khi tau ua rau nws los ntawm NodeJS. Peb coj lwm tus neeg cov qauv ua lub hauv paus - tsis muaj qhov zais cia loj ntawm no.
Peb pub lub cev ntawm qhov kev thov raws li kev nkag mus rau peb txoj haujlwm - ntawm qhov tso zis peb tau txais cov ntoo parsed syntax hauv daim ntawv ntawm JSON khoom.
Tam sim no peb tuaj yeem khiav los ntawm tsob ntoo no nyob rau sab nraud thiab sib sau ua ib qho kev thov nrog cov indents, coloring, thiab formatting uas peb xav tau. Tsis yog, qhov no tsis yog kho tau, tab sis nws zoo li peb tias qhov no yuav yooj yim.
Mapping query thiab npaj nodes
Tam sim no cia saib yuav ua li cas peb tuaj yeem muab cov phiaj xwm uas peb tau txheeb xyuas hauv thawj kauj ruam thiab cov lus nug uas peb tau txheeb xyuas hauv qhov thib ob.
Cia peb ua piv txwv yooj yim - peb muaj cov lus nug uas tsim CTE thiab nyeem los ntawm nws ob zaug. Nws tsim cov phiaj xwm zoo li no.
Qhov no txhais tau hais tias yog peb pom CTE tiam ib qhov twg hauv qhov kev thov thiab ib qho ntawm qhov chaw hauv txoj kev npaj CTE, ces cov nodes mas nws yeej "sib ntaus" nrog ib leeg, peb tuaj yeem ua ke tam sim ntawd.
Teeb meem nrog lub hnub qub: CTEs tuaj yeem ua zes.
Muaj cov tsis zoo nested sawv daws yuav, thiab txawm ib tug ntawm tib lub npe. Piv txwv li, koj tuaj yeem sab hauv CTE A kom ua CTE X, thiab nyob rau tib theem sab hauv CTE B ua dua CTE X:
WITH A AS (
WITH X AS (...)
SELECT ...
)
, B AS (
WITH X AS (...)
SELECT ...
)
...
Thaum sib piv, koj yuav tsum nkag siab qhov no. Nkag siab qhov no "nrog koj ob lub qhov muag" - txawm pom txoj kev npaj, txawm tias pom lub cev ntawm qhov kev thov - yog qhov nyuaj heev. Yog tias koj CTE tiam neeg nyuaj, zes, thiab cov kev thov loj, ces nws tsis nco qab kiag li.
UNION
Yog tias peb muaj lo lus tseem ceeb hauv cov lus nug UNION [ALL] (tus neeg teb xov tooj ntawm kev koom nrog ob qho qauv), tom qab ntawd hauv txoj kev npaj nws sib raug rau ob lub node Append, los yog ib co Recursive Union.
Qhov uas yog "sab saum toj" saum toj no UNION - qhov no yog thawj xeeb leej xeeb ntxwv ntawm peb cov node, uas yog "hauv qab" - thib ob. Yog dhau UNION peb muaj ob peb blocks "glued" ib zaug, ces Append- tseem yuav muaj ib leeg xwb, tab sis nws yuav tsis muaj ob, tab sis ntau tus me nyuam - raws li lawv mus, raws li:
(...) -- #1
UNION ALL
(...) -- #2
UNION ALL
(...) -- #3
Append
-> ... #1
-> ... #2
-> ... #3
Teeb meem nrog lub hnub qub: nyob rau hauv recursive sampling tiam (WITH RECURSIVE) kuj tuaj yeem ua tau ntau tshaj ib UNION. Tab sis tsuas yog qhov kawg block tom qab qhov kawg ib txwm rov ua dua UNION. Txhua yam saum toj no yog ib qho, tab sis txawv UNION:
WITH RECURSIVE T AS(
(...) -- #1
UNION ALL
(...) -- #2, ΡΡΡ ΠΊΠΎΠ½ΡΠ°Π΅ΡΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΡΡΠ°ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΠ΅ΠΊΡΡΡΠΈΠΈ
UNION ALL
(...) -- #3, ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎΡ Π±Π»ΠΎΠΊ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΉ ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ T
)
...
Ib zaug ntxiv ua haujlwm "nrog lub hnub qub". Peb muab qhov kev thov, ua nws, peb tsis muaj npe - peb tsuas yog nyeem ob zaug los ntawm tib CTE.
Peb saib ntawm txoj kev npaj - qhov teeb meem yog dab tsi? Vim li cas peb thiaj muaj npe? Peb tsis tau xaj nws. Nws puas tau txais "tus lej xov tooj" zoo li no?
Qhov thib ob ua haujlwm "nrog lub hnub qub": Yog tias peb nyeem los ntawm lub rooj sib faib, ces peb yuav tau txais cov node Append los yog Merge Append, uas yuav muaj ntau tus "cov menyuam yaus", thiab txhua tus yuav ua li cas Scan'om los ntawm lub rooj-section: Seq Scan, Bitmap Heap Scan los yog Index Scan. Tab sis, txawm li cas los xij, cov "cov menyuam yaus" no yuav tsis yog cov lus nug nyuaj - qhov no yog li cas cov nodes tuaj yeem txawv ntawm Append ntawm UNION.
Peb kuj nkag siab txog cov pob caus ntawd, sau lawv βhauv ib pawgβ thiab hais tias: βtxhua yam koj nyeem los ntawm megatable yog ntawm no thiab nqes tsob ntoo".
Tab sis ntawm no txhua yam yog yooj yim - xws li nodes li Limit, Sort, Aggregate, WindowAgg, Unique "daim ntawv qhia" ib-rau-ib rau cov neeg ua haujlwm sib txuas hauv qhov kev thov, yog tias lawv nyob ntawd. Tsis muaj "hnub qub" lossis teeb meem ntawm no.
SIB THAM
Teeb meem tshwm sim thaum peb xav ua ke JOIN nruab nrab ntawm lawv tus kheej. Qhov no tsis yog ib txwm ua tau, tab sis nws yog ua tau.
Los ntawm cov lus nug parser lub ntsiab lus ntawm kev pom, peb muaj qhov node JoinExpr, uas muaj raws nraim ob tug me nyuam - sab laug thiab sab xis. Qhov no, raws li, yog qhov "saum toj no" koj JOIN thiab sau dab tsi "hauv qab" nws hauv kev thov.
Thiab los ntawm qhov pom ntawm txoj kev npaj, cov no yog ob tug xeeb leej xeeb ntxwv ntawm qee leej * Loop/* Join- node. Nested Loop, Hash Anti Join, ... - ib yam li ntawd.
Cia peb siv cov laj thawj yooj yim: yog tias peb muaj cov rooj A thiab B uas "sib koom" ib leeg hauv txoj kev npaj, tom qab ntawd hauv kev thov lawv tuaj yeem nyob ib leeg. A-JOIN-B, lossis B-JOIN-A. Wb sim ua ke li no, cia wb sim ua ke ua lwm yam, thiab mus txog thaum peb khiav tawm ntawm cov khub zoo li no.
Cia peb rov kos nws hauv daim duab - huag, nws twb zoo li ib yam dab tsi!
Cia peb nco ntsoov tias peb muaj cov nodes uas ib txhij muaj me nyuam B thiab C - peb tsis quav ntsej txog qhov kev txiav txim. Cia peb muab lawv thiab tig daim duab ntawm node dhau.
Wb rov los saib dua. Tam sim no peb muaj cov nodes nrog cov me nyuam A thiab khub (B + C) - sib xws nrog lawv ib yam nkaus.
Zoo heev! Nws hloov tawm tias peb yog ob tus no JOIN los ntawm kev thov nrog cov phiaj xwm nodes tau ua tiav ua ke.
Alas, qhov teeb meem no tsis yog ib txwm daws tau.
Piv txwv li, yog nyob rau hauv ib qho kev thov A JOIN B JOIN C, thiab nyob rau hauv txoj kev npaj, ua ntej ntawm tag nrho cov, "sab nrauv" nodes A thiab C tau txuas nrog, tab sis tsis muaj tus neeg teb xov tooj hauv qhov kev thov, peb tsis muaj dab tsi los qhia, tsis muaj dab tsi los txuas lus rau. Nws zoo ib yam nrog "comma" thaum koj sau A, B.
Tab sis, feem ntau, yuav luag tag nrho cov nodes tuaj yeem "kho" thiab koj tuaj yeem tau txais hom profile ntawm sab laug hauv lub sijhawm - lus, zoo li hauv Google Chrome thaum koj txheeb xyuas JavaScript code. Koj tuaj yeem pom ntev npaum li cas txhua kab thiab txhua nqe lus tau coj mus rau "ua tiav."
Thiab kom nws yooj yim dua rau koj siv tag nrho cov no, peb tau ua qhov chaw cia khaws cia, qhov twg koj tuaj yeem txuag tau thiab tom qab ntawd pom koj cov phiaj xwm nrog rau kev thov cuam tshuam lossis qhia qhov txuas nrog lwm tus.