áá±á¬áºáá±á¬áºáá»á¬ážáá»á¬áž áá¯á¶ážáá±ááŒáá«ááŒá®á
... áááºááá¯ááºáᬠá¡á
á®á¡á
áẠáá¯á¶ááŸááºáá»á¬ážá¡ááœáẠáááºá
ááºááŸá¯ááŸááá±á¬ á¡ááááºá¡ááŒáœááºáá»á¬ážááŒáá·áº ááŸáá
áœá¬ áá®ááá¯ááºážááœá²áá¬ážáá±á¬ áá±ážááœááºážáá
áºáá¯ááá¯á· ...
á€á
á¬á
á¯á áá¯áááááá¯ááºážááᯠáá°á ááŸááºáááºážááœáẠáá±á¬áºááŒáá¬ážáááºá
áá¯á¶ááŸááºáá±ážááŒááºážááŸá¯ á áœááºážáá±á¬ááºááẠááŒá¿áá¬áá»á¬ážááŸáá·áº áááºážááá¯á·á ááŒá±ááŸááºážáá»ááºáá»á¬ážááᯠáá±á¬ááºážáá«ážááœáẠááœá±á·ááŸáááá¯ááºáááºá áááááá¯ááºážá á á¬áá¬ážááŸááºáááºážááá¯
"áá¬ááá»ááºážááŒá áºáá±áá±á¬ SQL áá±ážááœááºážáá»á¬ážá¡ááœáẠáá»ááºááŒá¯ááºáááºážáá»á¬áž" .
ááááŠážá áœá¬ áá±ážáá±á¬ááºááŒááºááŒáá¡á±á¬áẠ- ááŒá®ážáá±á¬á· á¡á á®á¡á ááºááᯠá¡áá±á¬ááºáááŒááºáá±á¬á·áá² á¡áá±á¬ááºááŒááºááŒá®ážáá¬ážá ááŸáááŒá®áž áá¬ážáááºááá¯ááºáá±ááá·áº áá±á¬ááºážááá¯áá»ááºáá áºáá¯áá±á¬á· ááŸáááŒá®ážáá¬ážáá«á
áá
áºáá¯á¶ážááŸááœá²áá¯ááºááá·áº áá±á¬ááºážááá¯áá»ááºááẠáá¯á¶á
á¶áááŒáá±á¬ âá
á¬ááœááºâ ááŒáá·áº á¡ááœááºáá¯ááºááá¯ážááŒá®áž á¡áááºáááŒá±ááŒá
áºáá±áá¯á¶ááááºá
á¡áá°ážáááŒáá·áº developer áá»á¬ážááẠáá¯ááºááœáẠáá±á¬ááºážááá¯áá»ááºáááá¯ááºáááºááᯠâáá±á¬áºâ áá¬ážáá±á¬á¡áá« (áá«áá áá¯ááºáá«áááºá ááá·áºáá»ááºáááºáá¯á¶á
á¶á áá«áá±ááá·áº á¡á²áá«á) áá
áºááŒá±á¬ááºážáááºážáá²á· ááŒá
áºááœá¬ážáá¬á ááŒá±á¬ááºá
áá¬áá±á¬ááºážáá±á¬!
áá«ááᯠáá
áºáááºážáááºážáá²á· ááá¯ááŸá¡á±á¬áẠááœá²ááŒáá·áºáá¡á±á¬ááºá
á€á¡áá¬á¡á¬áž áá»áœááºá¯ááºááá¯á· ááŸáá
áœá¬ááœá²ááá¯ááºáá«áá ááá¯ááá¯áááºááŸá¬ áá±á¬ááºážááá¯áá»ááºáááá¯ááºáááºááᯠááŒá¯ááºáá¯ááºááŒá®áž ááŒááºáááºáá±á«ááºážá
ááºážááá¯ááºáá«áá ááá¯á·áá±á¬áẠá€áá±á¬ááºážááá¯ááŸá¯áá¡áá¬ááá¹áá¯áá
áºáá¯á
á®ááœáẠá¡ááááºá¡ááŒáœááºáá
áºáá¯ááᯠáá°ážááœá²áá¬ážááá¯ááºááẠ- á¡á
á®á¡á
ááºááœáẠáá°áá®áá±á¬á¡áá»ááºááŸá¬ ááŒá
áºáá»ááºáá²á·áááºá
Query syntax tree
áá®ááá¯áá¯ááºááá¯á·á áá±á¬ááºážááá¯áá»ááºááᯠáŠážá
áœá¬ááœá²ááŒááºážá
áááºááŒá¬ááá«áááºá
áá¬ááŒá
áºááá¯á·áá²ááá¯áá±á¬á· áá«ááá¯á·ááŸá¬ááŸááááºá
áá»áœááºá¯ááºááá¯á·ááá¯ááºáá±á¬ááºáá»ááºá¡ááœáẠááá·áºááœááºážááŸá¯á¡ááŒá
Ạáá±á¬ááºážááá¯áá»ááºáááá¯ááºáááºááᯠáá»áœááºá¯ááºááá¯á·áá»áœá±ážááœá±ážááẠ- á¡ááœááºááœáẠáá»áœááºá¯ááºááá¯á·ááẠJSON á¡áá¬ááá¹áá¯áá¯á¶á
á¶ááŒáá·áº ááœá²ááŒááºážá
áááºááŒá¬áá¬ážáá±á¬ á¡áá¬ážá¡ááá¯áá
áºáááºááᯠáááŸááá«áááºá
ááᯠáá»áœááºá¯ááºááá¯á·ááẠá€áá
áºáááºááᯠááá·áºáá»ááºáááºáááºážááŒá±á¬ááºážá¡ááá¯ááºáž ááŒááºááŒá±ážááá¯ááºááŒá®áž áá»áœááºá¯ááºááá¯á·ááá¯áá»ááºáá±á¬ á¡ááºáááºážáá»á¬ážá á¡áá±á¬ááºááŒááºááŒááºážááŸáá·áº áá±á¬áºáááºáá»ááŒááºážááá¯á·ááŒáá·áº áá±á¬ááºážááá¯áá»ááºáá
áºáá¯ááᯠá
á¯á
ááºážááá¯ááºáá«ááŒá®á ááá¯ááºáá°ážá áá«á á
áááºááŒáá¯ááºááŒááºáááºááá¯á· áááá±ááá·áº áá«á á¡áááºááŒá±áááºááá¯á· áááºááááºá
ááŒá±áá¯á¶áá¯ááºááŒááºáž á á¯á¶á ááºážáá±ážááŒááºážááŒááºáž ááŸáá·áº á¡á á®á¡á á¥áº áá¯á¶ááŸááºáá»á¬áž
á¡áᯠáááá¡ááá·áºááŸá¬ ááœá²ááŒááºážá áááºááŒá¬áá¬ážáá²á· á¡á á®á¡á ááºáá²á· áá¯áááááá¯ááºážááŸá¬ ááœá²ááŒááºážá áááºááŒá¬áá¬ážáá²á· áá±ážááœááºážááᯠáááºááá¯áá±á«ááºážá ááºááá¯ááºááá²ááá¯áᬠááŒáá·áºááŒáá¡á±á¬ááºá
ááá¯ážááŸááºážáá±á¬ á¥ááá¬áá
áºáá¯ááᯠááŒáá·áºááŒáá«á
áá¯á· - áá»áœááºá¯ááºááá¯á·ááœáẠCTE áá
áºáá¯ááᯠáá¯ááºáá±ážááŒá®áž áááºážá០ááŸá
áºááŒááẠáááºááŒáá±á¬ query áá
áºáá¯ááŸááááºá áá°áá®ááá¯á¡á
á®á¡á
á¥áºáá
áºáá¯áá¯ááºáá±ážáááºá
CTE
ááá¯áá
áá¯ááºááŒáá·áºáá»áŸáẠáá¬ážááŸááºáž 12 á¡áá (ááá¯á·ááá¯áẠáááºážááᯠáá±á¬á·áá»ááºá
á¬áá¯á¶ážááŒáá·áº á
áááºáááºá MATERIALIZED
) ááœá²á·á
ááºážááŸá¯
ááá¯ááá¯áá¬á áá±á¬ááºážááá¯áá»ááºáá²ááŸá¬ áá
áºáá±áá¬áá¬ááŸá¬ CTE áá»áá¯ážáááºáá²á· á¡á
á®á¡á
ááºáá²á· áá
áºáá±áá¬áá¬ááŸá¬ áá¯á¶áá»ááºáá
áºáá¯ááᯠááœá±á·áááºá CTE
áá«ááᯠáá® node ááœá±á áá
áºáá¯áá²á·áá
áºáᯠ"ááá¯ááº" ááŸá¬ áá±áá»á¬áá«áááºá áá«ááá¯á·á á¡á²áá«ááœá±ááᯠáá»ááºáá»ááºážáá±á«ááºážá
ááºááá¯á·ááááºá
ááá±ááœáá·áºááŸáá·áº ááŒá¿áá¬: CTEs áá»á¬ážááᯠnested áá¯ááºááá¯ááºáá«áááºá
á¡ááœááºáá¶á·áá»ááºážáá±á¬ á¡ááá¯ááºáá»á¬ážááŸáááŒá®áž áá¬áááºáá°áá»á¬ážááẠááŸááá«áááºá á¥ááá¬á¡á¬ážááŒáá·áº, áááºáááºá¡áá²ááŸá¬ááá¯ááºáá«áááºá CTE A
á¡á±á¬áẠCTE X
á¡áá²ááŸá¬ áá²á· á¡áá°áá°áá«áá²á CTE B
áááºáá¯ááºáá«á CTE X
:
WITH A AS (
WITH X AS (...)
SELECT ...
)
, B AS (
WITH X AS (...)
SELECT ...
)
...
ááŸáá¯ááºážááŸááºáá²á·á¡áá« áá«ááᯠáá¬ážáááºááááºá ဠ"áááºááá»ááºá áááŒáá·áº" ááá¯áá¬ážáááºááŒááºáž - á¡á á®á¡á ááºááá¯ááŒááºáááºááá¯ááºáá±á¬ááºážááá¯ááŸá¯áááá¹áá¬ááá¯ááºááá¯ááŒááºááŒááºáž - á¡ááœááºáááºáá²áááºá áááºá CTE áá»áá¯ážáááºááẠááŸá¯ááºááœá±ážááŒá®áž á¡ááá¯ááºá¡ááŒá¯á¶ááŒá áºááŒá®áž áá±á¬ááºážááá¯áá»ááºáá»á¬áž ááŒá®ážáá¬ážáá«áá áááºážááẠáá¯á¶ážááááááá¬ážáááá«á
ááŒááºáá±á¬ááºá á¯
á¡áááºá áá»áœááºá¯ááºááá¯á·ááœáẠáá±á¬á·áá»ááºá
á¬áá¯á¶ážáá
áºáá¯ááŸááá»áŸáẠUNION [ALL]
(ááá°áá¬ááŸá
áºáá¯áá«áááºááá·áº á¡á±á¬áºááá±áá¬)á ááá¯á·áá±á¬áẠá¡á
á®á¡á
ááºááœáẠáááºážááẠnode áá
áºáá¯ááŸáá·áºáá
áºáᯠáááºááá¯ááºáááºá Append
ááá¯á·ááá¯áẠá¡áá»áá¯á· Recursive Union
.
"á¡áááº" áá°áááºáá¬ážá UNION
- á€áááºááŸá¬ áá»áœááºá¯ááºááá¯á·á node á ááááá»áá¯ážáááºááŒá
áºááŒá®ážá "á¡á±á¬ááº" - áá¯áááááŒá
áºáááºá ááŒááºááœá¬ážáá»áŸáẠUNION
áá
áºáá»áááºáááºážááœáẠ"áá±á¬áº" áá¯ááºááœááºáá»á¬ážá
áœá¬ááŸááááºá Append
- node áá
áºáá¯áá¬ááŸááá«áááá·áºáááºá ááá¯á·áá±á¬áº áááºážááœáẠááŸá
áºáá¯ááá¯ááºá ááá±ážáá»á¬ážáá»á¬ážá
áœá¬ááŸááááá·áºááẠ- á¡áá®ážáá®ážá¡ááá¯ááºá
(...) -- #1
UNION ALL
(...) -- #2
UNION ALL
(...) -- #3
Append
-> ... #1
-> ... #2
-> ... #3
ááá±ááœáá·áºááŸáá·áº ááŒá¿áá¬: recursive sampling áá»áá¯ážáááºá¡ááœááºáž (WITH RECURSIVE
) áá
áºáá¯áááºááá¯ááá¯ááºáááºá UNION
. áá«áá±ááá·áº áá±á¬ááºáá¯á¶ážáá
áºáá¯ááŒá®ážááẠáá±á¬ááºáá¯á¶ážáá
áºáá¯á¶ážááᬠá¡ááŒá²áááºáž ááŒááºááŸáá·áºáááºáá±áááºá UNION
. á¡áááºáá±á¬áºááŒáá«á¡áá¬á¡á¬ážáá¯á¶ážááẠáá
áºáá¯áááºážááŒá
áºáá±á¬áºáááºáž ááœá²ááŒá¬ážáááºá UNION
:
WITH RECURSIVE T AS(
(...) -- #1
UNION ALL
(...) -- #2, ÑÑÑ ÐºÐŸÐœÑаеÑÑÑ Ð³ÐµÐœÐµÑаÑÐžÑ ÑÑаÑÑПвПгП ÑПÑÑПÑÐœÐžÑ ÑекÑÑÑОО
UNION ALL
(...) -- #3, ÑПлÑкП ÑÑÐŸÑ Ð±Ð»ÐŸÐº ÑекÑÑÑОвМÑй О ÐŒÐŸÐ¶ÐµÑ ÑПЎеÑжаÑÑ ÐŸÐ±ÑаÑеМОе к T
)
...
áááºáááºááá¯áá²á·ááá¯á·áá±á¬á¥ááá¬áá»á¬ážááᯠ"ááœááº" ááá¯ááºáááºááá¯á¡ááºáááºá áá®á¥ááá¬ááŸá¬ áá»áœááºáá±á¬áºááŒááºáá«áááºá UNION
- áá»áœááºá¯ááºááá¯á·á áá±á¬ááºážááá¯áá»ááºááœáẠá¡ááá¯ááºáž á ááá¯ááºážááŸááááºá á¡ááŸááºááŒá®ážá UNION
ááá¯ááºáá® Append
-node ááŸáá·áº á¡ááŒá¬áž - Recursive Union
.
áá±áá¬áááº-áá±áž
á¡á¬ážáá¯á¶ážááŒááºáááºááŒá®ážáá«ááŒá®á áááºááá·áºáá±á¬ááºážááá¯áá»ááºáá¡ááá¯ááºážááẠáááºááá·áºá¡á á®á¡á ááºáá¡ááá¯ááºážááŸáá·áº ááá¯ááºáá®áááºááᯠáá»áœááºá¯ááºááá¯á·áááá«áááºá á€á¡ááá¯ááºážáá»á¬ážááœáẠáá»áœááºá¯ááºááá¯á·ááẠâáááºááŸá¯ááá¯ááºáá±á¬â á¡áá¬ááá¹áá¯áá»á¬ážááᯠá¡ááœááºááá°ááŸáá·áº ááá¬áá¡ááá¯ááºáž ááŸá¬ááœá±ááá¯ááºáááºá
á
á¯á¶á
ááºážááŸá¯ ááŸá¯áá±á¬áá·áºá០ááŒáá·áºáá»áŸáẠáááºážááẠááá¬áž ááá¯á·ááá¯áẠCTE ááŒá
áºáááºááᯠáá»áœááºá¯ááºááá¯á· ááááá±á¬áºáááºáž áááºážááá¯á·ááᯠáá°áá®áá±á¬ node á០áááºááŸááºáá±ážáá¬ážáááºá RangeVar
. âáááºááŸá¯ááá¯ááºááŸá¯â á á
ááºážáááºážáá»ááºáá»á¬ážá¡áá áááºážááẠáá»áŸáá»áŸáá ááá·áºáááºáá¬ážáá±á¬ 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]
á¡á
á®á¡á
ááºáááœá²á·á
ááºážáá¯á¶ááŸáá·áºáá±ážááŒááºážáá»ááºááá¯áá»áœááºá¯ááºááá¯á·áááááºá áá¯ááºááœááºáá»á¬ážáá
á¬áá±ážá
á¬áá°ááá¯áá»áœááºá¯ááºááá¯á·áááááºá á¡áá¬ááá¹áá¯áá»á¬ážáá¡áááºáá»á¬ážááá¯áá»áœááºá¯ááºááá¯á·ááááẠ- áá»áœááºá¯ááºááá¯á·áááºáá
ẠáŠáž ááŸáá·áºáá
ẠáŠáž ááŸáá¯ááºážááŸááºááŸá¯ááŒá¯áá¯ááºáááºá
áááẠáá¬ááẠ"ááŒááºááœáá·áº". áá»áœááºá¯ááºááá¯á·ááẠáá±á¬ááºážááá¯áá»ááºááᯠáááºáá¶áááºá áááºážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáá«á áá»áœááºá¯ááºááá¯á·ááœáẠáá¬áááºááŸááºáá
áºáá¯áá»áŸ áááŸááá«á áá°áá®áá±á¬ CTE á០áááºážááᯠááŸá
áºááŒáááºáááºáá¯á¶áá¬ááŸááááºá
á¡á
á®á¡á
á¥áºááᯠááŒáá·áºááá¯ááºáá±á¬á· ááŒá¿áá¬á áá¬áá²á áá»áœááºá¯ááºááá¯á·ááœáẠá¡áááºááŒá±á¬áá·áº á¡áááºáá¬ááá
áºáá¯ááŸáááááºážá áá«ááá¯á·á á¡áááá·áºááá±ážáá°ážá á€áá²á·ááá¯á·áá±á¬ "áá¶áá«ááºáá¶áá«ááº" ááá¯áááºááŸá¬áááááºážá
PostgreSQL á áááºážááᯠáá°á·áá¬áá¬áá° ááá·áºáááºá á¡á²áá«ááᯠáá¬ážáááºááá¯á·áá²ááá¯áááºá á¡á²áá®ááᯠáá¬áááºáá±ážáá¯á¶áá«áá²á áá»áœááºá¯ááºááá¯á·á¡ááœááºá á¡á á®á¡á ááºááŸáá·áº ááŸáá¯ááºážááŸááºááẠáááºááœááºáá»ááºá¡ááœááºá áááºážááẠá¡áááá¹áá«ááºáááŸááá«á áááºážááᯠá€áá±áá¬ááœáẠááá¯ážááŸááºážá áœá¬ ááá·áºááœááºážáá¬ážáááºá áá°á·ááᯠááá¯áá áá¯ááºáá¡á±á¬ááºá
áá¯ááá áá¬ááẠ"ááŒááºááœáá·áº": á¡áááºá áá»áœááºá¯ááºááá¯á·ááẠá¡ááá¯ááºážááá¯ááºážááœá²áá¬ážáá±á¬ááá¬ážá០áááºáá±áá«áá áá»áœááºá¯ááºááá¯á·ááẠnode áá
áºáá¯ááááá·áºáááºá Append
ááá¯á·ááá¯áẠMerge Append
"ááá±ážáá»á¬áž" á¡áá»á¬ážá¡ááŒá¬ážáá« á ááºááá·áºá áá
áºáá¯áá»ááºážá
á®áááºáá
áºáááºážáááºážááŒáá·áºááŒá
áºáááá·áºáááºá Scan
'om't table-section á០Seq Scan
, Bitmap Heap Scan
ááá¯á·ááá¯áẠIndex Scan
. áááºááá¯á·áááºááá¯á
á±áá¬áᰠဠ"ááá±ážáá»á¬áž" ááẠááŸá¯ááºááœá±ážáá±á¬áá±ážááœááºážáá»á¬ážááá¯ááºáá« - á€áááºááŸá¬ á€áá¯á¶ááŸááºáá»á¬ážááᯠáááºááá¯á·ááœá²ááŒá¬ážááá¯ááºáááºáááºážá Append
ááœáẠUNION
.
áá»áœááºá¯ááºááá¯á·áááºáž ááá¯áá¯á¶ážáá»á¬ážááᯠáá¬ážáááºááŒá®áž áááºážááá¯á·ááᯠ"áá
áºáá¯á¶áááºáž" á
á¯á
ááºážááŒá®áž ááŒá±á¬áá«- "ááẠmegatable ááŸáááºááá»áŸá¡áá¬á¡á¬ážáá¯á¶ážáááºá€ááœááºááŸáá·áºáá
áºáááºá¡á±á¬ááºááœááºááŸááááºá".
"ááá¯ážááŸááºáž" áá±áá¬áááºáá¶ááŒááºáž nodes
Values Scan
á¡á
á®á¡á
ááºááœáẠááá¯ááºáá®áá«áááºá VALUES
áá±á¬ááºážááá¯ááŸá¯áá
Result
ááá«áá²áá±á¬ááºážááá¯ááŸá¯áá
áºáá¯ááŒá
áºáááºá FROM
áá²á·ááá¯á· SELECT 1
. áá«ááŸááá¯áẠááááºááᬠááœá²ááŸá¬ážáá²á· á¡áá¯á¶ážá¡ááŸá¯ááºážááœá± ááŸááá±áá²á·á¡áá« WHERE
-block (ááá¯á¡áá« attribute áá±á«áºáá¬áááºá 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
áá¬áááºáá° SRF áá»á¬ážá¡ááœáẠ"ááŒá±áá¯á¶"
ááá¯á·áá±á¬áº á¡á
á¯ááá¯ááºá¡ááŒá¯á¶ááá¯áẠá
á¯á¶á
ááºážááŸá¯áá»á¬ážááŒáá·áº á¡áá¬á¡á¬ážáá¯á¶ážááẠááá¯ááá¯ááŸá¯ááºááœá±ážááẠ- áá¶ááá±á¬ááºážá
áœá¬ááŒáá·áºá áááºážááá¯á·ááẠá¡ááŒá²áááºážá¡ááŒá
áºááá¯á· ááŒá±á¬ááºážáá²ááœá¬ážááŒááºážáááŸááá±á InitPlan
/SubPlan
. ááá«ááᶠá¡ááŒá
áºááá¯á· ááŒá±á¬ááºážááœá¬ážááŒáááºá ... Join
ááá¯á·ááá¯áẠ... Anti Join
á¡áá°ážáááŒáá·áº áááºááŒáá¯ááºáá²á·á¡áá¬áá
áºáá¯ááᯠáá±ážáá«á WHERE NOT EXISTS ...
. á€áá±áá¬ááœáẠáááºážááá¯á·ááᯠáá±á«ááºážá
ááºážááẠá¡ááŒá²áááºáž áááŒá
áºááá¯ááºáá« - á¡á
á®á¡á
ááºá á
á¬áá¬ážááœáẠá¡á
á®á¡á
ááºá node áá»á¬ážááŸáá·áº áááºááá¯ááºááá·áº á¡á±á¬áºááá±áá¬áá»á¬áž áááŸááá«á
áááẠáá¬ááẠ"ááŒááºááœáá·áº": á¡áá»áá¯á· VALUES
áá±á¬ááºážááá¯ááŸá¯áá á€ááá
á¹á
ááœááºááŸáá·áº á¡á
á®á¡á
ááºááœáẠáááºááẠnode á¡áá»á¬ážá¡ááŒá¬ážááᯠáááŸááááºááŒá
áºáááºá Values Scan
.
âáá¶áá«ááºáááºâ áá±á¬ááºáááºááœá²áá»á¬ážááẠáááºážááá¯á·ááᯠáá
áºáá¯ááŸáá·áºáá
áºáᯠááœá²ááŒá¬ážááááŒááºááá¯ááºá
á±ááẠáá°áá®áá±ážáááá·áºááẠ- áááºááá¯ááºáá¬áá»á¬ážááᯠááœá±á·ááŸáááá·áºá¡á
á®á¡á
á¥áºá¡ááá¯ááºáž á¡ááá¡áá» áá±á«ááºážááá·áºáá¬ážáááºá VALUES
- áá±á¬ááºážááá¯áá»ááºáá
áºáá»áŸá±á¬ááºááœáẠá¡áá±á«áºááŸá¡á±á¬ááºááŒá±á¡ááááááºááá¯á·ááŒááºážá
áá±áá¬á¡ááŒá±á¬ááºážá¡áá²áá²á·
áá»áœááºá¯ááºááá¯á·ááá±á¬ááºážááá¯ááŸá¯ááœáẠá¡áá¬á¡á¬ážáá¯á¶ážááᯠááœá²áá¯ááºááá¯ááºáá¯á¶áá±á«áºááẠ- áá»ááºáá¬á¡á¬ážáá¯á¶ážáá«áá²á Limit
.
ááá¯á·áá±á¬áº á€áá±áá¬ááœáẠá¡áá¬á¡á¬ážáá¯á¶ážááẠááá¯ážááŸááºážááẠ- ááá¯áá²á·ááá¯á·áá±á¬ nodes áá»á¬ážááŒá
áºáááºá Limit
, Sort
, Aggregate
, WindowAgg
, Unique
áá±á¬ááºážááá¯áá»ááºááœáẠáááºááá¯ááºáᬠá¡á±á¬áºááá±áá¬áá»á¬ážáᶠâááŒá±áá¯á¶â ááᯠáá
áºáá¯á¶ááŸáá
áºáá¯á¶á á€áá±áá¬ááœáẠ"ááŒááºáá»á¬áž" ááá¯á·ááá¯áẠá¡áááºá¡áá²áá»á¬áž áááŸááá«á
JOIN
áá±á«ááºážá
ááºážááá¯áá±á¬á¡áá«ááœáẠá¡áááºá¡áá²áá»á¬áž ááŒá
áºáá±á«áºáá¬áááºá JOIN
áá°ááá¯á·á¡áá»ááºážáá»ááºážááŒá¬ážá áá«á á¡ááŒá²áááºážáááŒá
áºááá¯ááºáá±ááá·áº ááŒá
áºááá¯ááºáááºá
query parser áá¡ááŒááºááŸá áá»áœááºá¯ááºááá¯á·ááœáẠnode áá
áºáá¯ááŸááááºá JoinExpr
áááºáá¬á ááá±áž ááŸá
áºáá±á¬ááºááááááŸááááºá á€áááºááŸá¬ ááá·áº JOIN á "á¡áááº" ááŸáá·áº áá±á¬ááºážááá¯áá»ááºááœáẠáááºážááᯠ"á¡á±á¬ááºááœááº" áá±ážáá¬ážááá·áºá¡áá¬ááŒá
áºáááºá
á¡á
á®á¡á
á¥áºá¡ááŒááºá¡áá áááºážááá¯á·ááẠá¡áá»áá¯á·áá±á¬ áá¬ážá
ááºááŒá±ážááẠááŸá
áºáŠážááŒá
áºáááºá * Loop
/* Join
-node á Nested Loop
, Hash Anti Join
áá®áž... - áá
áºáá¯áá¯áá±á«á·á
ááá¯ážááŸááºážáá±á¬áá¯áá¹ááááá¯áá¯á¶ážááŒáá«á
áá¯á·- á¡á
á®á¡á
ááºááœáẠáá»áœááºá¯ááºááá¯á·ááœáẠáá
áºáá¯ááŸáá·áºáá
áºáᯠ"áá°ážáá±á«ááºáž" áá±á¬ááá¬ážáá»á¬áž A ááŸáá·áº B ááŸááá«áá áá±á¬ááºážááá¯áá»ááºááœáẠáááºážááá¯á·ááᯠááŸá¬ááœá±ááœá±á·ááŸáááá¯ááºáááºá A-JOIN-B
ááá¯á·ááá¯áẠB-JOIN-A
. áá®áááºážáá²á· áá±á«ááºážá
ááºááá¯ááºáá¡á±á¬ááºá áááŒá¬ážáááºážáá²á· áá±á«ááºážá
ááºááá¯ááºáá¡á±á¬ááºá á¡á²ááá¯á¡ááœá²ááœá± ááá¯ááºááá»ááºáž áá±á«ááºážááá¯ááºááŒáá¡á±á¬ááºá
áá«ááá¯á·áá²á· syntax tree ááá¯áá°áá¡á±á¬ááºá áá«ááá¯á·á¡á
á®á¡á
ááºááá¯áá°á á¡á²áá«ááœá±ááá¯ááŒáá·áºáá¡á±á¬ááº... á¡áá¬ážáá°ááá¯ááºáá°áž!
ááááºáá¯á¶á
á¶áá²á· ááŒááºááœá²ááŒáá·áºáá¡á±á¬áẠ- á¡áá¯ážá á¡á²áá«á áá
áºáá¯áá¯áá²á·áá°áá±ááŒá®á
áá»áœááºá¯ááºááá¯á·ááœáẠB ááŸáá·áº C ááá±ážáá»á¬áž áá
áºááŒáá¯ááºáááºáááºážááŸááá±á¬ node áá»á¬ážááŸááááºááᯠáááááŒá¯ááŒáá«á
áá¯á· - áá»áœááºá¯ááºááá¯á·ááẠáááºááá·áºáááºážááŸáá·áºáá»áŸ ááá¯áá
áá¯ááºáá«á áááºážááá¯á·ááᯠáá±á«ááºážá
ááºááŒá®áž node ááá¯á¶ááᯠááŸááºááŒáá·áºááŒáá«á
áá¯á·á
áááºááŒáá·áºáá¡á±á¬ááºá ááᯠáá»áœááºá¯ááºááá¯á·ááœáẠááá±áž A ááŸáá·áº á¡ááœá²áá»á¬áž (B + C) áá«ááŸáááẠ- áááºážááá¯á·ááŸáá·áºáááºáž ááá¯ááºáááºáá«áááºá
ááá¯ááºáááº! áá«ááá¯á·á áá®ááŸá
áºáá±á¬ááºáá² áá±á«áºáá¬áá¬á JOIN
á¡á
á®á¡á
áẠnode áá»á¬ážááŸáá·áº áá±á¬ááºážááá¯ááŸá¯á០á¡á±á¬ááºááŒááºá
áœá¬ áá±á«ááºážá
ááºáá²á·áááºá
áá¶ááá±á¬ááºážá
áœá¬áá²á áá®ááŒá¿áá¬ááá¯á¡ááŒá²áááŒá±ááŸááºážááá¯ááºáá«á
á¥ááá¬á¡á¬ážááŒáá·áº áá±á¬ááºážááá¯ááŸá¯áá
áºáá¯á A JOIN B JOIN C
á¡á
á®á¡á
ááºááœáẠáŠážá
áœá¬áááá¡áá±ááŒáá·áº âá¡ááŒááºáááºâ áá¯á¶ááŸáẠA ááŸáá·áº C ááá¯á·ááᯠáá»áááºáááºáá¬ážáááºá ááá¯á·áá±á¬áº áá±á¬ááºážááá¯áá»ááºááœáẠááá¯ááá¯á·áá±á¬á¡á±á¬áºááá±áá¬áááŸááá«á áá»áœááºá¯ááºááá¯á·ááœáẠáá®ážáá±á¬ááºážááá¯ážááŒá
áá¬áá¬áá»áŸáááŸáá á¡ááááºá¡ááŒáœááºáááºááŒá
áá¬áááŸááá«á á
á¬áá±ážáá²á·á¡áá« "áá±á¬áºáá¬" áá²á· á¡áá°áá°áá«áá²á A, B
.
ááá¯á·áá±á¬áºá ááá
á¹á
á¡áá»á¬ážá
á¯ááœááºá node áá»á¬ážá¡á¬ážáá¯á¶ážáá®ážáá«ážááᯠ"áá»áááº" ááá¯ááºááŒá®áž JavaScript áá¯ááºááá¯ááœá²ááŒááºážá
áááºááŒá¬áá±á¬á¡áá«ááœáẠGoogle Chrome áá²á·ááá¯á·á
á¬áá¬ážá¡áá á€áááá¯ááá¯ááºááá¯áááºáááºááœááºá¡áá»áááºáá®áááá¯ááºáááºá á
á¬ááŒá±á¬ááºážáá
áºáá¯á
á®ááŸáá·áº áá¯ááºááŒááºáá»ááºáá
áºáá¯á
á®ááẠ"execute" áá¯ááºááẠá¡áá»áááºáááºáá»áŸááŒá¬áááºááᯠáááºááŒááºááá¯ááºáááºá
á€á¡áá¬á¡á¬ážáá¯á¶ážááᯠááá·áºá¡ááœáẠááá¯ááá¯á¡áááºááŒá±á
á±áááºá¡ááœáẠáá»áœááºá¯ááºááá¯á·ááẠááá¯ááŸá±á¬ááºááŸá¯ááᯠááŒá¯áá¯ááºáá¬ážáá«áááºá
á¡áááºá áááºááẠáá¯á¶áá±á¬ááºáá±á¬áá¯á¶á
á¶ááá¯á· ááááºááá¯ááºáá±á¬áá±ážááœááºážáá
áºáá¯ááᯠáá°áá±á¬ááºáá¬ááẠááá¯á¡ááºáá«áá á¡áá¯á¶ážááŒá¯áá«á
source: www.habr.com