á áľááľáá áĽá¨á°á áá áŤááľ áĽááá˝
... á ááŤáá áááł áá°á°ááá áá áá
áá°ááá
á¨áĽá
áľ á áááá˝ á¨á ááľ áááŽá˝ áááĄ-
á áá
á¨áĽáą ááá°á ááá áááŁá ááľáĽ
áá°ááá°á á¨áĽáŤá á ááťá¸á á˝ááŽá˝ áĽá áááľáááťá¸á á¨á°áááá á¨ááááŞáŤá ááá áááŁá á á˝áá ááľáĽ ááááá˘
"á¨áłáá ᨠ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
- ááľááá ááááľ áĽá áááá - 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 áĽáŤáąá áá¨ááŤáᢠáŤáá áá¨áłáľ áĽáť áŤáľáááááłá áá áĽáá°áá á áááľ á°ááá áľá ááĽá, á¨áá áą áá áááááá ááááá˝, ááá áľááá á áá°áĽá, á ááá áĽáá á°á¨ááŻá. ááĽáą áľáŠá¨áľ á ááľáĽá˘
ááá°áá á°ááŁá "á áŽá¨áĽ ááááľ": á¨á°á¨ááá á á¨á´á áá áĽáŤáá áĽá á¨áá, á¨ááŤá ááľááá ááááľ áĽááááá Append
ááá Merge Append
, áĽáąá áĽá ááĽá áŤáá¸áá "ááá˝" áŤáŤáľáłá, áĽá áĽáŤááłááłá¸á á áá ááááľ áááá Scan
á¨ááá á áá á¨áĽ: Seq Scan
, Bitmap Heap Scan
ááá Index Scan
. áá á ááááá áááł áĽááá
"ááá˝" ááľáĽáľáĽ áĽáŤááá˝ á áááá - áĽááá
á áááá˝ á¨áááŠáľ á áá
ááááľ áá. Append
á UNION
.
áĽáá°ááá
áŤááľá áá áŽáá˝ áĽáá¨áłáá, "á á ááľ ááá" á°áĽáľá§á¸á áĽá áĽáá˛á
áá á: "á¨áááłáĽá á¨ááŤááĄáľ ááá áá áĽáá
áĽá á¨áá áá áá".
"ááá" ááἠááá ፠á áááá˝
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
ááááá áľáááá á˝ááŽá˝ áá¨á°áłá JOIN
á áŤáłá¸á ááŤá¨á. áá
áááá á¨ááťá á áá°áá, áá ááťáá.
á¨á áŤáá á°ááłá áĽááłáŁ ááľááá ááááľ á ááᢠJoinExpr
á áľááá áááľ ááá˝ áŤááľ - á፠áĽá áá. áá
ᣠá áá
áá°á¨áľáŁ á¨áĽááľá ááááá âá¨ááâ áŤáá áĽá á áĽáŤáá ááľáĽ âá¨áłá˝â á°áĽá á¨á°áťáá ááá˘
áĽá á¨áĽá
áą áĽááł á ááťá áĽááá
áááľ á¨á ááłááľ ááŽá˝ áá¸á * Loop
/* Join
- ááľááá ááááľ. Nested Loop
, Hash Anti Join
,... - áĽáá° 'á áŤá ááá.
ááá á ááááŽáá˝á áĽáá ááᥠá áĽá
áą ááľáĽ âá¨ááŁááŠâ á°áá á¨áŚá˝ A áĽá B áŤáá á áĽáŤáá ááľáĽ áááąá ááá áá˝áá A-JOIN-B
, ááá B-JOIN-A
. á áá
ááááľ áááŁáá áĽááááᣠá áá á áŠá á°áá áááŁáá áĽááááᣠáĽá á¨ááłá°ááľá áĽááśá˝ áĽáľááá¨ááľ áľá¨áľá˘
á¨á ááŁáĽ ááá˝áá áĽááá°áľáŁ áĽá
áłá˝áá áĽááᣠáĽááŤá¸á... á áááłá°áá!
á ááŤá ááá áĽáááá¨á - áŚá
ᣠááľááá á¨áá ááá áááľáá!
á á ááľ áá ááὠᢠáĽá ᲠáŤáá¸á á áááá˝ áĽááłáá áĽááľá°áá - á áá á
á°á á°á¨á°á ááľ á¨áááᢠáĽááąá áĽááŁáá áĽá á¨ááľááá ááááąá ááľá áá° áá áĽááá.
áĽáá°áá áĽááᢠá áá á¨ááá˝ A áĽá áĽááśá˝ (B + C) áá - á¨ááą áá á¨ááľáá ááśá˝ á ááá˘
á áŁá áĽáŠ! áĽá áĽááá
áááľ áááá˝áá áŤáłáŤá JOIN
á¨áĽáŤáá áĽá
áľ á áááá˝ á á°áłáŤ áááł á°áŁáá¨áá.
ááŽ, áá
á˝áá áááá á áááłá.
áááłá, á áĽáŤá ááľáĽ á¨áá A JOIN B JOIN C
, áĽá á áĽá
áą ááľáĽ, á ááááŞáŤ, "ááŤá" á áááá˝ A áĽá C á°áááá°áá. ááá áá á áĽáŤáá ááľáĽ áĽáá°áá
á áááľ áŚááŹá°á á¨áá, ááá á¨ááŤáá ááá á¨ááá, ááá ááá á áŤáááá. á áá˝áá áľ áá "áŽá" áá á°ááłáłá áá A, B
.
áá á á áĽááááš á ááŁááá˝ ááá ááľááá ááááśá˝ âá¨á°ááąâ ááá áá˝áá áĽá áĽáá°áá
ááááąá ááá፠á áá á á፠á áŠá ááááľ áá˝áá - á áĽáŹá ᣠáá áĽáá° á፠áľááŞááľ áŽáľ á˛á°ááľá á Google Chrome ááľáĽá˘ áĽáŤááłááą ááľáá áĽá áĽáŤááłááą ááá፠âáááááâ áá áŤá
á áá áĽáá°áá°á° áá¨áľ áľá˝ááá
á˘
áĽá áá
á áá ááá áá ááĽááľá á¨á áá á ááş áĽáá˛áá, áá¨ááť á áľáááá
á¨áááá ἠáá áá
áá° á á á
á˝ áĽáť áááŁáľ á¨ááá áá áá
ááá: hab.com