á áľááľáá áĽá¨á°á áá áŤááľ áĽááá˝ - á¨á á¨PostgreSQL áĽá áľ ááľáá á áááááľ á¨ááŤáá ááŤáá á ááąá ááŤáá áá˝áá - áááá ἠá¨áá¨áĽáľ á¨á áááá áááἠááľáłááťá á ááá...

... á ááŤáá áááł áá°á°ááá áá áá
áá°ááá
á¨áĽá
áľ á áááá˝ á¨á ááľ áááŽá˝ áááĄ-

á áá
á¨áĽáą ááá°á ááá áááŁá ááľáĽ áá
áá áĽáá´áľ ááľá¨á áĽáá°áťáá áĽáááááłááá˘
áá°ááá°á á¨áĽáŤá á ááťá¸á á˝ááŽá˝ áĽá áááľáááťá¸á á¨á°áááá á¨ááááŞáŤá ááá áááŁá á á˝áá ááľáĽ ááááᢠ.
á ááááŞáŤ ᣠáá áá áĽáááá - áĽá áĽá áąá á¨á áá á áá ááá á áá°ááá ᣠááľáááá ááá ááŁá ᣠááľááá ááá áĽá ááá¨áłáľ á¨ááŤáľá¸áá ááá á áá ᣠáá áĽáŤáá˘
áĽáá°áá
áŁá á
áááľ áŁáá°á°áŤ âáá
â á¨áááἠááľáłááťá áá á¨áá¨á á áĽáŤá á áŁá á áľááŤá áĽá áľááá
á¨áááá˝ ááľá áłá¨áá˘

á á°ááá ááá˘áá˝ á¨áĽáŤááá á áŤá á áŽáą ááľáĽ "á˛áŁá á" (áá
á áĽááἠáá¨-áá°áá áá ᣠáá áá¨á°áłá) á á ááľ ááľááᢠá á°áá!
áá
á á áá ááááľ á ááŤáá áááł áĽááłá áá˘

áĽá áá
áá á ááŤáá áááł ááłá á¨áťáá ᣠáááľá ᣠáá°áŁá á áĽá á¨áĽáŤááá á áŤá á ááľ áá áá°áĽá°áĽ á¨áťáá ᣠá¨á፠ááĽáŤááłááą á¨áá
áĽáŤá ááá ááá âááŤáŤáâ áĽáá˝ááá - á áĽá
áą ááľáĽ á á°ááá°á ááĽáĽ áá á¨á°á¨á°á°áá˘
á¨áĽáŤá á ááŁáĽ áá
áá
áá áááľá¨á á ááááŞáŤ áĽáŤáá áá°áá°á á áá áľ.

ááááŤáąá á ááᢠ, á¨á፠ááĽáą ááá á á°á¨áá, áá˝áá . áĽáá° áĽáááą á¨ááᣠáĽááá
á¨PostgreSQL á°ááłá ááľáŁá á áŤááľ áá á¨á°áŤáá âáá°áŞáŤáá˝â áá¸áᢠáááľá á°áá°á á ááá á áááľáŽá˝ á¨á°á ááᨠáĽá á¨áĽáą áá ááŤáŤáŁáὠᨠNodeJS á°á°ááááᢠá¨ááá˝ á°áá˝á áááá˝ áĽáá° áá°á¨áľ á áľááá ááľá°áá - áĽáá
ááá áľáá
ááľáĽá á¨áá.
á¨áĽáŤááá á áŤá á¨ááááá á áá°ááŁáŤá˝á ááĽá áľ áá - á áá¤áą áá á 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
