ืจืืื ืฉืืืจ ืืฉืชืืฉืื
... ืืฉืืืืชื ืืขืืฆืืช ืืืคืืื ืขื ืจืืืื ืืงืฉืจืืื ืืฆืืชื ืืชืืื ืืช ืืืชืืืืื:
ืืชืืืื ืื ืฉื ืืืืง ืืฉื ื ืฉืื
ืืช ืืชืืืื ืฉื ืืืืง ืืจืืฉืื, ืืืืงืืฉ ืืืขืืืช ืืืฆืืขื ืฉืืืืชืืช ืืืคืืกืืืช ืืคืชืจืื ืืชืืื, ื ืืชื ืืืฆืื ืืืืืจ
"ืืชืืื ืื ืืฉืืืืชืืช 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
.
ืื ืื ื ืื ืืืื ืื ืงืฉืจืื ืืืื, ืืืกืคืื ืืืชื "ืืขืจืืื ืืืช" ืืืืืจืื: "ืื ืื ืฉืืชื ืงืืจื ื-megatable ื ืืฆื ืืื ืืืืืฉื ืืขืฅ".
ืฆืืชืื "ืคืฉืืืื" ืืงืืืช ื ืชืื ืื
Values Scan
ืชืืื ืืชืืื ืืช VALUES
ืืืงืฉื.
Result
ืืื ืืงืฉื ืืื FROM
ืืื SELECT 1
. ืื ืืฉืืฉ ืื ืืืืื ืืืื ืืืืื ื WHERE
-block (ืืื ืืชืืื ื ืืืคืืขื 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
. ื ื ืกื ืืฉืื ืื, ื ื ืกื ืืฉืื ืืคืื, ืืื ืืืื ืขื ืฉืืืืืจื ืื ื ืืืืืช ืืืื.
ืืืื ื ืืงื ืืช ืขืฅ ืืชืืืืจ ืฉืื ื, ื ืืงื ืืช ืืชืืื ืืช ืฉืื ื, ื ืกืชืื ืขืืืื... ืื ืืืืื!
ืืืื ื ืฆืืืจ ืืช ืื ืืืืฉ ืืฆืืจื ืฉื ืืจืคืื - ืื, ืื ืืืจ ื ืจืื ืืื ืืฉืื!
ื ืฉืื ืื ืฉืืฉ ืื ื ืฆืืชืื ืฉืืฉ ืืื ืื ืืื ืืช ืืืืื ื' ื-ื' - ืื ืืืคืช ืื ื ืืืืื ืกืืจ. ืืืื ื ืฉืื ืืืชื ืื ืืคืื ืืช ืืชืืื ื ืฉื ืืฆืืืช.
ืืืื ื ืกืชืื ืฉืื. ืืขืช ืืฉ ืื ื ืฆืืชืื ืขื ืืืืื A ืืืืืืช (B + C) - ืชืืืืื ืื ืืืืื.
ืืืื! ืืกืชืืจ ืฉืื ืื ื ืืฉื ืืื ืืืื JOIN
ืืืืงืฉื ืขื ืืชืืื ืืช ืฆืืชืื ืฉืืืื ืืืฆืืื.
ืืืื, ืืขืื ืื ืื ืชืืื ื ืคืชืจืช.
ืืืฉื, ืื ืืืกืืจืช ืืงืฉื A JOIN B JOIN C
, ืืืชืื ืืช ืงืืื ืื ืืชืืืจื ืืฆืืชืื ื"ืืืฆืื ืืื" A ื- C. ืืื ืืื ืืคืขืื ืืื ืืืงืฉื, ืืื ืื ื ืื ืืืืืืฉ, ืืื ืื ืืฆืจืฃ ืจืื. ืื ืืืชื ืืืจ ืขื ื"ืคืกืืง" ืืฉืืชื ืืืชื A, B
.
ืืื, ืืจืื ืืืงืจืื, ืืืขื ืื ืืฆืืชืื ื ืืชื ืื ื"ืืชืจืช ืงืฉืจ" ืืชืืืื ืืงืื ืกืื ืื ืฉื ืคืจืืคืื ืืฆื ืฉืืื ืืืื - ืคืฉืืื ืืืฉืืขื, ืืื ืืืืื ืืจืื ืืฉืืชื ืื ืชืืื ืงืื JavaScript. ืืชื ืืืื ืืจืืืช ืืื ืืื ืืงื ืื ืฉืืจื ืืื ืืฆืืจื "ืืืืฆืื ืืคืืขื".
ืืืื ืฉืืืื ืื ื ืื ืืืชืจ ืืืฉืชืืฉ ืืื ืื, ืืฆืจื ื ืืืกืื
ืื ืืชื ืจืง ืฆืจืื ืืืืื ืฉืืืืชื ืืืชื ืงืจืืื ืืฆืืจื ื ืืืชื, ืืฉืชืืฉ
ืืงืืจ: www.habr.com