ααΆα
αααΎαααααααα»αααααΎαα½α
α αΎα
... α
αΌααα
αααα»ααααα½ααααααΆααα
ααΆαααΆααααααααα’αΆαααΆαα½αααΉαααΆαααααΆαααΆαααα·αααααααΆααααααΆαααααααΆααααααααΌαααααΆα
αα
αααα»αααααα·α
αΆαα·ααααααααααΈααΈαααααααααΆααα
ααααα·α αΆααΉααααααααααΈαα½α αααα§αααα·αααααααα αΆααααΎαααΆααααα½αααααααΆ αα·ααααααααααΆααααααα½ααα α’αΆα ααααΆααα αααα»αα’ααααα
"ααΌααααααααααΆαααααα½α SQL ααΊ" .
ααααΌαααΎαα αΆααααααΎαααΆαααα - α αΎαααΎαααΉαααααααααΆααααααΆα ααΎαααΆαααΆααααααΆαα½α α αΎα ααΎαααΆαααΆααα’αΆαα αΎαα’αΆα αααααΆα ααα»ααααααααΎαα½αα
ααΆα αΆααααΌα
ααΆαα½αααΎαααΆααΆαα½αααΉα "αααααΉα" ααααα·αααΆαααααΎαααααααααΆααααααα ααααΎαααααΆαα
ααααΈαααααα ααα»ααΎααα
α’αΆαααααααΆαα α αΎαααΌα
ααααααΆααΆαααΆααα’αΆαααα’α½αα
ααΆαα·ααααα
ααααααα’αααα’αα·αααααα "ααΆααα·α" αα½ααααααΎαα
αααα»αααΌα (αααααΆααΆααα·αααΆαα, ααααΆααα½α, ααα»ααααααΆααΎαα‘αΎα) αα
αααα»ααααααΆαααα½αα ααααααααΆαα!
αααααΌααααααΆααααααα’αΆαα
α αΎαααααα·αααΎααΎαα’αΆα
ααΌαααΆαααΆααααααααα’αΆα αααααΊααΆααΆααα»αααΎ αα·αααΆαααααα
αΌαααααΆααΌααα½ααααααΎααα αααααΎαα’αΆα
"ααααΆαα" ααΌαααααα»ααα½ααα
ααΆααααααα»ααΈαα½ααααααααΎααα - α’αααΈαααααΆαααΎαα‘αΎααα
α
ααα»α
αααααααΌαααααΆαα
αααα»ααααααΆαα
αααααΆαααΆααααααααααααααα½α
ααΎααααΈααααΎααΌα
αααα ααααΎααααΌααααααααΆααααΌαα
αααααΆαααααΎαααΆα
ααΎααααα
αΌααα½ααααααΎααΆααΆαα»αααα
αΌααα
αααα»ααα»αααΆαααααααΎα - αα
αααααα ααΎαααα½αααΆααααααΆαααΆααααααααααααααααΆαααααααα»αααααααααΆααααα» JSON α
α₯α‘αΌαααα ααΎαα’αΆα
αααααΆαααααααΆαααααααα»ααα·ααα
αααα»α α αΎααααααΌααααα»αααααΎααΆαα½αααΉαααΆαα
αΌααααααΆαα ααΆαααΆααααα αα·ααααααααααααΎαα
ααααΆαα αα ααΆβαα·αβα’αΆα
βααααΌαβααΆαβααααβααΆαβαα ααα»ααααβααΆβα αΆααβααΌα
βααΆβααΎαβααΆβααΆβααΉαβααΆαβααΆαβααΆααααα½αα
ααΆαααΌααααααΈαααα½α αα·αααααααααααΆαα
α₯α‘αΌααααααΌαααΎαααΈαααααααααΎαα’αΆα αααα αΌαααααΆααΌααααααΆααααααΎαααΆααα·ααΆααααα»αααα αΆαααααΌα αα·ααααα½ααααααΎαααΆααα·ααΆααααα»αααα αΆαααΈααΈαα
α
αΌαααα§ααΆα αααααΆαααααα½α - ααΎαααΆααααα½αααααααααΎα CTE α αΎαα’αΆαααΈααΆααΈαααα ααΆαααααααΎααααααΆαααααααα
CTE
ααααα·αααΎα’ααααααα‘ααααΎαααΆααααααα»ααααααααααα αΌαααααααα 12 (α¬α
αΆααααααΎαααΈααΆαααααααΎααΆααααααααΉα MATERIALIZED
) ααΆααααααΎα
αααααΆααααααΆααααα·αααΎααΎαααΎαααααΆαα CTE αα
ααααααααΆαα½ααα
αααα»αααααΎ αα·αααααΆαααα
ααααααααΆαα½ααα
αααα»ααααααΆα CTE
αααααΆααααααααΆααααΆαααααααααΆααααΆ "ααααα»ααα" ααΆαα½αααααΆ ααΎαα’αΆα
αααα
αΌαααααΆααΆαααααΆααα
αααα αΆααΆαα½ααααααΆααααΆαα CTEs α’αΆα
ααααΌαααΆαααΆααα
ααΆααααα»αααααα·αααΌαααα’ α αΎααααααΆααααΆααααααααΌα
ααααΆαααααα α§ααΆα αααα’αααα’αΆα
αα
ααΆααααα»α CTE A
ααΎααααΈαααααΎα CTE X
αα·ααα
ααααα·αααΌα
ααααΆαα
ααΆααααα»α CTE B
ααααΎβααΆβααααβααα CTE X
:
WITH A AS (
WITH X AS (...)
SELECT ...
)
, B AS (
WITH X AS (...)
SELECT ...
)
...
αα ααααααααααα α’αααααααΌααααααααΈααΏααααα ααΆααααααΉαααα "ααααααααααααα’ααα" - ααΌααααΈααααΎαααΎααααααΆαααΌααααΈααααΎαααΎαααΆαααΆαααααααΎ - ααΊαα·ααΆαααααΆααααΆααα ααααα·αααΎααααΆαα CTE ααααα’ααααααα»αααααΆα ααΆααααΆαα α αΎαααααΎααΆαα αααΎα αααααΆααΉαααααααααΆαααααα»αα
αα ααΈα
ααααα·αααΎααΎαααΆαααΆααααααααΉααα
αααα»ααααα½α UNION [ALL]
(ααααα·ααααα·ααααααΆαα
αΌααα½αααααΌααΈα) αααααΆαααααα
αααα»ααααααΆαααΆααααΌαααααΆαα
ααΉαααααΆααααΆαα½αα Append
α¬αααα Recursive Union
.
α’αααΈαααααΆ "ααΆαααΎ" ααΆαααΎ UNION
- αααααΊααΆααΌαα
α
ααααΌαααααααΆααααααααΎαααα "ααΆαααααα" - ααΈααΈαα ααααα·αααΎααααααΆαα UNION
ααΎαααΆααααα»αααΆα
αααΎα "ααα’α·αααΆαα" αααα»αααααααα½α Append
- ααΆβααΉαβαα
βααβααΆαβααααΆααβαα½αβααα»ααααα ααα»ααααβααΆβααΉαβαα·αβααΆαβααΈαβαα ααα»ααααβααΆαβααΌαβααΆβα
αααΎα - ααΆαβααααΆααβαααβαα½αβααβαα
βαααβαααα½αα
(...) -- #1
UNION ALL
(...) -- #2
UNION ALL
(...) -- #3
Append
-> ... #1
-> ... #2
-> ... #3
αααα αΆααΆαα½ααααααΆααααΆαα αα
ααΆααααα»αααΆααααααΎαααααΌα‘αΎααα·α (WITH RECURSIVE
) ααα’αΆα
ααΆαα
αααΎαααΆααα½αα UNION
. ααα»ααααααΆααααααα»αα
α»αααααααααα»ααααααΆααααΈαα½αα
α»ααααααααΊαααααααΎαα‘αΎααα·αα UNION
. ααΆααα’ααααΆαααΎααΊαααα½α ααα»αααααα»αααααΆ UNION
:
WITH RECURSIVE T AS(
(...) -- #1
UNION ALL
(...) -- #2, ΡΡΡ ΠΊΠΎΠ½ΡΠ°Π΅ΡΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΡΡΠ°ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΠ΅ΠΊΡΡΡΠΈΠΈ
UNION ALL
(...) -- #3, ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎΡ Π±Π»ΠΎΠΊ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΉ ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ T
)
...
α’αααβααβααααΌαβααΆαβααααααΆαβΒ«αα·αΒ»βα§ααΆα αααβαααβαααα αααα»αα§ααΆα ααααααααΎαααΎα UNION
- ααΆα 3 ααααααα
αααα»αααααΎααααααΎαα ααΌα
ααααα αΎααα½αα UNION
ααααΌαααΉα Append
-node αα·ααα½αααα - Recursive Union
.
α’αΆα - ααααααα·αααααα
α’αααΈαβααααΌαβααΆαβαααβα αβαα½α βα αΎα α₯α‘αΌαβααΎαβααΉαβααΆβααααΎβαα½αβααΆβααααΌαβααΉαβαααααβααΆβααβααααααα α αΎααα αααα»ααααααααΆααααα ααΎαα’αΆα αααααααααααα»ααΆαααααααα "α’αΆα α’αΆαααΆα" αααΆαααΆααααα½α αα·ααααααααααΆαα·α
ααΆααααααααααααα½α ααΎααα·αααΉαααΆααΆααΆααΆααΆα α¬ CTE αα ααα»αααααα½αααΆααααΌαααΆαααααααααααααΆααααΌα
ααααΆ RangeVar
. α αΎααα
αααα»ααααααααααα "α’αΆα
α’αΆαααΆα" αααααααΆαααα»αααααΆαααααααΆαααααααααααα
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 ααΈαααααααΆααΆαα Seq Scan
, Bitmap Heap Scan
α¬ Index Scan
. ααα»αααααααα»αααααΈααΆααααα "αα»ααΆα" ααΆαααααααΉααα·ααααααΆαααα½ααααα»αααααΆα - αααααΆαααααααααααΆααααΆαααααα’αΆα
ααααΌαααΆααααααΆααααΈ Append
αα
UNION
.
ααΎαβααβαααβααΈβααΆαβα
αβααααβαααβαααβααα αααααΌαβααΆ βαααα»αβαα½αβααααβ α αΎαβαα·ααΆαα βα’αααΈααααααααΆααααα’αααααΆαα’αΆαααΈ megatable ααΊαα
ααΈααα αα·αα
α»ααααααααΎαααΎ".
ααααΆααααα½ααα·αααααα "ααΆαααα"
Values Scan
ααααΌαααααΆααΉααααααΆα VALUES
αα
αααα»αααααΎα
Result
ααΊααΆααΆαααααΎαα»ααααααααΆα FROM
α
αΌαα
α·ααα SELECT 1
. α¬αα
ααααααα’αααααΆαααΆααααα
ααααα·αα·ααα·ααααα
ααααΆαα
αααα»α WHERE
- αααα»α (αααααΆαααααα»αααααααααα
α‘αΎα 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
"αααααΈ" αα
SRFs αααααααααΌα
ααααΆα
ααα»ααααααΆαα½αααΉααααα½ααααααααΆααααααΆαα½α α’αααΈααααααααΆαααΊααΆαααααααα»αααααΆα - ααΆα’αα»αα αα½ααααα·αααααααααααα
ααΆ InitPlan
/SubPlan
. ααααααααα½ααααααααα
ααΆ ... Join
α¬ ... Anti Join
ααΆαα·ααααα
αααα’ααααααααα’αααΈαα½αααΌα
ααΆ WHERE NOT EXISTS ...
. α αΎααα
ααΈαααααΆαα·ααααααα’αΆα
αααα
αΌαααααΆαα½αααααΆααα - αα
αααα»αα’ααααααααααααΆααα·αααΆαααααα·ααααα·αααααααααΌαααααΆαα
ααΉαααααΆαααααααααΆααααααα
ααααααα ααΆααα·α
αα
"ααΆαα½ααααααΆααααΆα"α αααα VALUES
αα
αααα»αααααΎα αααα»αααααΈααααα·ααααα»ααααααΆαα’αααααΉαααα½αααΆαααααΆααααΆα
αααΎαα Values Scan
.
αα
αα
αα "ααα" ααΉααα½ααααα
αααα½αααΆααΈααααΆαα
αα·ααα
αα - αα½αααααααΌαααΆααααααααααΆααα·αααααΆααααΆαααααΆαααααααααΎααααααααΌαααααΆα VALUES
- αααα»αααΆαααααΎααΈααααΌααα
ααΆαα
ααααΎαααΆααα·αααααα
ααΆα αΆααααΈααΌα
ααΆα’αααΈαααΆααα’αααα
αααα»αααααΎααααααΎαααααΌαααΆαααααααα
ααα αΎα α’αααΈααα
ααααααααΊ Limit
.
ααα»αααααα
ααΈαααα’αααΈααααααααΆαααΊααΆαααα - ααααΆααααΌα
ααΆ Limit
, Sort
, Aggregate
, WindowAgg
, Unique
"αααααΈ" ααΈαα½ααα
αα½ααα
ααΆααααααα·ααααα·αααααααααΌαααααΆαα
αααα»αααααΎ ααααα·αααΎαα½ααααα
ααΈαααα αα·αααΆα "ααααΆα" α¬ααΆαααααΆααα
ααΈαααααα
α αΌααα½α
ααΆαααααΆαααΎαα‘αΎααα
ααααααααΎαα
αααααα
αΌαααααΆ JOIN
αααΆααα½αααα ααααα·ααααααα’αΆα
αα
αα½α
ααααα ααα»ααααααΆα’αΆα
αα
αα½α
α
ααΆαααααααααααα’αααααααααα½α ααΎαααΆαααααΆαα JoinExpr
αααααΆαααΌαααΈαααΆαααα·αααααΆαα - ααααααα·αααααΆαα αααβααΎβααΆαβαααβααΊβααΆβα’αααΈβααα "ααΆαβααΎ" JOIN ααααβα’ααα αα·αβα’αααΈβαααβααααΌαβααΆαβααααα "ααΆαααααα" ααΆβαα
βαααα»αβααααΎα
α αΎαβααΆαβααααααβααβαααααΆαβαααβααΊβααΆβααΌαβα
α
βααΈαβααΆααβααααβα’αααβαααα * Loop
/* Join
- ααααΆααα Nested Loop
, Hash Anti Join
,... - α’αααΈαα½αβααΌα
βαααα
α
αΌαααααΎαααααα·ααααΆααΆααααα ααααα·αααΎααΎαααΆαααΆααΆα A αα·α B ααα "α
αΌααα½α" ααααΆαα
αα·ααα
αααα
αααα»ααααααΆαααα ααΆαααΆαααααΎαα»α αα½αααα’αΆα
ααΆαααΈααΆαααα
A-JOIN-B
, α¬ B-JOIN-A
. α
αΌαβααΎαβααααΆααΆαβααααβαα·ααΈβααα α
αΌαβααΎαβααααΆααΆαβααααβαα·ααΈβαααααβαααβα αΎαβααααβαα αΌαβαααβααΎαβα’ααβααΌβαααβαααα
α
αΌαβααβαααααΆαβααΆαααααααααααβααααβααΎα ααβαααααΆαβααααβααΎαβααΎαβααΆ... αα·αβααΌα
βααααΆβαα!
αααααΌαααΆα‘αΎααα·αααΆααααααααααΆα αα - α’αΌ ααΆααΎααα
ααΌα
ααΆα’αααΈαα½αα αΎα!
α
αΌαααααααααΆααααΆααΎαααΆαααααΆααααααααα»ααααααααΆαααααΆααΆαααΌα B αα·α C - ααΎααα·ααααααααΆαα
αααα»αααααΆααα’αααΈαααααα α
αΌααααααα½αααΆ α αΎαααααααααΌαααΆαααααΆααααΈααΎα
αααααΎααααααααα α₯α‘αΌααααααΎαααΆαααααΆαααααααΆαααΌα A αα·αααΌ (B + C) - ααααααΆααΆαα½ααα½ααααααααα
α’ααα
αΆααα! ααΆααααααΆααΎαααΆααααΈααααα JOIN
ααΈααααΎααΆαα½αααααΆαααααααΆαααααΌαααΆααααα
αΌαααααΆαααααααααα
Alas, αααα αΆααααα·ααααααααααΌαααΆααααααααΆαααα
α§ααΆα αααααααα·αααΎαα
αααα»αααααΎ A JOIN B JOIN C
α αΎααα
αααα»ααααααΆα ααΆααααΌαααααΆαα "ααΆααααα
" A αα·α C ααααΌαααΆαααααΆααα ααα»αααααα·αααΆαααααα·ααααα·αααααααααα
αααα»αααααΎααααα ααΎαααααΆαα’αααΈαααααααΌαααααα
ααααΆαα’αααΈααααΌαααααΆααααΆαα½αααααααΆααααα½ααααααα ααΆααΌα
ααααΆααΉα "ααααα" αα
αααα’αααααααα A, B
.
ααα»αααααααα»αααααΈααΆαα
αααΎα ααααΎααααααααααααΆααααΆααα’ααα’αΆα
ααααΌαααΆα "αα·αααααΆαα" α αΎαα’αααα’αΆα
ααα½αααΆααααααααααααααααα
ααΆααααααααΆαααααααααΆ - ααΆααααααααα ααΌα
ααΆαα
αααα»α Google Chrome αα
αααα’ααααα·ααΆαααΌα JavaScript ααΆααΎαα α’αααβα’αΆα
βααΎαβααΎαβααΈβααααααβαααβαααααΆααβααΈαα½αα αα·αβααα
ααααΈαααααααΆαααβααΈαα½ααβααααΌαβα
αααΆαβαααβααΎααααΈ "ααααα·ααααα·"α
α αΎαααΎααααΈααααΎα±ααααΆααΆααααααΆααααα½ααααααΆααα’ααααααα»αααΆαααααΎααααΆααααΆααα’ααααα αα½αααΎαααΆααααααΎααααααααααα»α
ααααα·αααΎα’αααααααΆααααααααΌαααΆαααΆααααααα½αααααα·αα’αΆα
α’αΆαααΆαα
αΌααα
αααα»ααααααααααααααααΆαα ααΌαααααΎ
ααααα: www.habr.com