PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ืจื‘ื™ื ืฉื›ื‘ืจ ืžืฉืชืžืฉื™ื explain.tensor.ru - ื™ื™ืชื›ืŸ ืฉืฉื™ืจื•ืช ื”ื”ื“ืžื™ื” ืฉืœ ืชื•ื›ื ื™ืช PostgreSQL ืฉืœื ื• ืื™ื ื• ืžื•ื“ืข ืœืื—ืช ืžื›ื•ื—ื•ืช ื”ืขืœ ืฉืœื• - ื”ืคื™ื›ืช ื—ืœืง ืงืฉื” ืœืงืจื™ืื” ื‘ื™ื•ืžืŸ ื”ืฉืจืช...

PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”
... ืœืฉืื™ืœืชื” ืžืขื•ืฆื‘ืช ืœื”ืคืœื™ื ืขื ืจืžื–ื™ื ื”ืงืฉืจื™ื™ื ืœืฆืžืชื™ ื”ืชื•ื›ื ื™ืช ื”ืžืชืื™ืžื™ื:

PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”
ื‘ืชืžืœื™ืœ ื–ื” ืฉืœ ื”ื—ืœืง ื”ืฉื ื™ ืฉืœื• ื“ื™ื•ื•ื— ื‘-PGConf.Russia 2020 ืื ื™ ืื’ื™ื“ ืœืš ืื™ืš ื”ืฆืœื—ื ื• ืœืขืฉื•ืช ืืช ื–ื”.

ืืช ื”ืชืžืœื™ืœ ืฉืœ ื”ื—ืœืง ื”ืจืืฉื•ืŸ, ื”ืžื•ืงื“ืฉ ืœื‘ืขื™ื•ืช ื‘ื™ืฆื•ืขื™ ืฉืื™ืœืชื•ืช ื˜ื™ืคื•ืกื™ื•ืช ื•ืคืชืจื•ื ื•ืชื™ื”ืŸ, ื ื™ืชืŸ ืœืžืฆื•ื ื‘ืžืืžืจ "ืžืชื›ื•ื ื™ื ืœืฉืื™ืœืชื•ืช SQL ื—ื•ืœื•ืช".



ืจืืฉื™ืช, ื ืชื—ื™ืœ ืœืฆื‘ื•ืข โ€“ ื•ื›ื‘ืจ ืœื ื ืฆื‘ืข ืืช ื”ืชื•ื›ื ื™ืช, ื›ื‘ืจ ืฆื‘ืขื ื• ืื•ืชื”, ื›ื‘ืจ ื™ืฉ ืœื ื• ืื•ืชื” ื™ืคื” ื•ืžื•ื‘ื ืช, ืืœื ื‘ืงืฉื”.

ื ืจืื” ื”ื™ื” ืœื ื• ืฉืขื "ื’ื™ืœื™ื•ืŸ" ื›ืœ ื›ืš ืœื ืžืขื•ืฆื‘ ื”ื‘ืงืฉื” ืฉื ืฉืœืคื” ืžื”ื™ื•ืžืŸ ื ืจืื™ืช ืžืื•ื“ ืžื›ื•ืขืจืช ื•ืœื›ืŸ ืœื ื ื•ื—ื”.
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ื‘ืžื™ื•ื—ื“ ื›ืืฉืจ ืžืคืชื—ื™ื "ืžื“ื‘ื™ืงื™ื" ืืช ื’ื•ืฃ ื”ื‘ืงืฉื” ื‘ืงื•ื“ (ื–ื”ื•, ื›ืžื•ื‘ืŸ, ืื ื˜ื™-ืชื‘ื ื™ืช, ืื‘ืœ ื–ื” ืงื•ืจื”) ื‘ืฉื•ืจื” ืื—ืช. ืžึทื—ืจึดื™ื“!

ื‘ื•ืื• ื ืฆื™ื™ืจ ืืช ื–ื” ืื™ื›ืฉื”ื• ื™ืคื” ื™ื•ืชืจ.
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ื•ืื ื ื•ื›ืœ ืœืฆื™ื™ืจ ืืช ื–ื” ื‘ืฆื•ืจื” ื™ืคื”, ื›ืœื•ืžืจ ืœืคืจืง ื•ืœื”ืจื›ื™ื‘ ืืช ื’ื•ืฃ ื”ื‘ืงืฉื”, ืื– ื ื•ื›ืœ "ืœืฆืจืฃ" ืจืžื– ืœื›ืœ ืื•ื‘ื™ื™ืงื˜ ืฉืœ ื‘ืงืฉื” ื–ื• - ืžื” ืงืจื” ื‘ื ืงื•ื“ื” ื”ืžืงื‘ื™ืœื” ื‘ืชื•ื›ื ื™ืช.

ืขืฅ ืชื—ื‘ื™ืจ ืฉืื™ืœืชื•ืช

ืœืฉื ื›ืš, ืชื—ื™ืœื” ื™ืฉ ืœื ืชื— ืืช ื”ื‘ืงืฉื”.
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ื‘ื’ืœืœ ืฉื™ืฉ ืœื ื• ืœื™ื‘ืช ื”ืžืขืจื›ืช ืคื•ืขืœืช ืขืœ NodeJS, ืื– ื™ืฆืจื ื• ืžื•ื“ื•ืœ ื‘ืฉื‘ื™ืœ ื–ื”, ืืชื” ื™ื›ื•ืœ ืžืฆื ืื•ืชื• ื‘-GitHub. ืœืžืขืฉื”, ืืœื• ื”ืŸ "ื›ืจื™ื›ื•ืช" ืžื•ืจื—ื‘ื•ืช ืœื—ืœืง ื”ืคื ื™ืžื™ ืฉืœ ืžื ืชื— PostgreSQL ืขืฆืžื•. ื›ืœื•ืžืจ, ื”ื“ืงื“ื•ืง ืคืฉื•ื˜ ืžื•ืจื›ื‘ ืžื”ื™ื“ื•ืจ ื‘ื™ื ืืจื™ ื•ืžื‘ื•ืฆืขื•ืช ืืœื™ื• ื›ืจื™ื›ื•ืช ืž-NodeJS. ืœืงื—ื ื• ืืช ื”ืžื•ื“ื•ืœื™ื ืฉืœ ืื—ืจื™ื ื›ื‘ืกื™ืก - ืื™ืŸ ื›ืืŸ ืกื•ื“ ื’ื“ื•ืœ.

ืื ื• ืžืื›ื™ืœื™ื ืืช ื’ื•ืฃ ื”ื‘ืงืฉื” ื›ืงืœื˜ ืœืคื•ื ืงืฆื™ื” ืฉืœื ื• - ื‘ืคืœื˜ ื ืงื‘ืœ ืขืฅ ืชื—ื‘ื™ืจ ืžืžื ื•ืชื— ื‘ืฆื•ืจื” ืฉืœ ืื•ื‘ื™ื™ืงื˜ JSON.
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ืขื›ืฉื™ื• ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœืจื•ืฅ ื“ืจืš ื”ืขืฅ ื”ื–ื” ื‘ื›ื™ื•ื•ืŸ ื”ื”ืคื•ืš ื•ืœื”ืจื›ื™ื‘ ื‘ืงืฉื” ืขื ื”ื–ื—ื•ืช, ืฆื‘ื™ืขื” ื•ืขื™ืฆื•ื‘ ืฉืื ื—ื ื• ืจื•ืฆื™ื. ืœื, ื–ื” ืœื ื ื™ืชืŸ ืœื”ืชืืžื” ืื™ืฉื™ืช, ืื‘ืœ ื ืจืื” ืœื ื• ืฉื–ื” ื™ื”ื™ื” ื ื•ื—.
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ืžื™ืคื•ื™ ืฆืžืชื™ ืฉืื™ืœืชื” ื•ืชื•ื›ื ื™ืช

ื›ืขืช ื ืจืื” ื›ื™ืฆื“ ื ื•ื›ืœ ืœืฉืœื‘ ื‘ื™ืŸ ื”ืชื•ื›ื ื™ืช ืฉื ื™ืชื—ื ื• ื‘ืฉืœื‘ ื”ืจืืฉื•ืŸ ืœื‘ื™ืŸ ื”ืฉืื™ืœืชื” ืฉื ื™ืชื—ื ื• ื‘ืฉืœื‘ ื”ืฉื ื™.

ื ื™ืงื— ื“ื•ื’ืžื” ืคืฉื•ื˜ื” - ื™ืฉ ืœื ื• ืฉืื™ืœืชื” ืฉืžื™ื™ืฆืจืช CTE ื•ืงื•ืจืืช ืžืžื ื• ืคืขืžื™ื™ื. ื”ื•ื ืžื™ื™ืฆืจ ืชื•ื›ื ื™ืช ื›ื–ื•.
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

CTE

ืื ืืชื” ืžืกืชื›ืœ ืขืœ ื–ื” ื‘ื–ื”ื™ืจื•ืช, ืขื“ ื’ืจืกื” 12 (ืื• ืžืชื—ื™ืœื™ื ืžืžื ื” ืขื ืžื™ืœืช ื”ืžืคืชื— MATERIALIZED) ื”ื™ื•ื•ืฆืจื•ืช CTE ืžื”ื•ื•ื” ืžื—ืกื•ื ืžื•ื—ืœื˜ ืขื‘ื•ืจ ื”ืžืชื›ื ืŸ.
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ื–ื” ืื•ืžืจ ืฉืื ื ืจืื” ื“ื•ืจ CTE ืื™ืคืฉื”ื• ื‘ื‘ืงืฉื” ื•ืฆื•ืžืช ืื™ืคืฉื”ื• ื‘ืชื•ื›ื ื™ืช CTE, ืื– ื”ืฆืžืชื™ื ื”ืืœื” ื‘ื”ื—ืœื˜ "ื ืœื—ืžื™ื" ืื—ื“ ืขื ื”ืฉื ื™, ืื ื—ื ื• ื™ื›ื•ืœื™ื ืžื™ื“ ืœืฉืœื‘ ืื•ืชื.

ื‘ืขื™ื” ืขื ื›ื•ื›ื‘ื™ืช: ื ื™ืชืŸ ืœืงื ืŸ CTEs.
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”
ื™ืฉ ื›ืืœื” ืฉืžืงื•ื ื ื™ื ื‘ืฆื•ืจื” ื’ืจื•ืขื” ืžืื•ื“, ื•ืืคื™ืœื• ื›ืืœื” ื‘ืขืœื™ ืื•ืชื• ืฉื. ืœื“ื•ื’ืžื”, ืืชื” ื™ื›ื•ืœ ื‘ืคื ื™ื 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.
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ื–ื” ืฉ"ืœืžืขืœื”" ืœืžืขืœื” 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.
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ื ืชื•ื ื™ื ืงืจื™ืื”-ื›ืชื•ื‘ื”

ื”ื›ืœ ืขืจื•ืš, ืขื›ืฉื™ื• ืื ื—ื ื• ื™ื•ื“ืขื™ื ืื™ื–ื” ื—ืœืง ืžื”ื‘ืงืฉื” ืžืชืื™ื ืœืื™ื–ื” ื—ืœืง ื‘ืชื•ื›ื ื™ืช. ื•ื‘ื™ืฆื™ืจื•ืช ืืœื• ื ื•ื›ืœ ืœืžืฆื•ื ื‘ืงืœื•ืช ื•ื‘ื˜ื‘ืขื™ื•ืช ืืช ืื•ืชื ื—ืคืฆื™ื "ื ื™ืชื ื™ื ืœืงืจื™ืื”".

ืžื ืงื•ื“ืช ืžื‘ื˜ ืฉืœ ืฉืื™ืœืชื”, ืื ื—ื ื• ืœื ื™ื•ื“ืขื™ื ืื ื–ื” ื˜ื‘ืœื” ืื• 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]

ืื ื—ื ื• ื™ื•ื“ืขื™ื ืืช ืžื‘ื ื” ื”ืชื•ื›ื ื™ืช ื•ื”ืฉืื™ืœืชื”, ืื ื—ื ื• ื™ื•ื“ืขื™ื ืืช ื”ืชืืžืช ื”ื‘ืœื•ืงื™ื, ืื ื—ื ื• ื™ื•ื“ืขื™ื ืืช ืฉืžื•ืช ื”ืื•ื‘ื™ื™ืงื˜ื™ื - ืื ื—ื ื• ืขื•ืฉื™ื ื”ืฉื•ื•ืื” ืื—ื“ ืœืื—ื“.
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ืฉื•ื‘ ืžืฉื™ืžื” "ืขื ื›ื•ื›ื‘ื™ืช". ืื ื—ื ื• ืœื•ืงื—ื™ื ืืช ื”ื‘ืงืฉื”, ืžื‘ืฆืขื™ื ืื•ืชื”, ืื™ืŸ ืœื ื• ื›ื™ื ื•ื™ื™ื - ืื ื—ื ื• ืคืฉื•ื˜ ืงื•ืจืื™ื ืื•ืชื” ืคืขืžื™ื™ื ืžืื•ืชื• CTE.
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ืื ื—ื ื• ืžืกืชื›ืœื™ื ืขืœ ื”ืชื•ื›ื ื™ืช - ืžื” ื”ื‘ืขื™ื”? ืœืžื” ื”ื™ื” ืœื ื• ื›ื™ื ื•ื™? ืœื ื”ื–ืžื ื• ืืช ื–ื”. ืžืื™ืคื” ื”ื•ื ืžืฉื™ื’ "ืžืกืคืจ ืžืกืคืจ" ื›ื–ื”?

PostgreSQL ืžื•ืกื™ืฃ ืืช ื–ื” ื‘ืขืฆืžื•. ืืชื” ืจืง ืฆืจื™ืš ืœื”ื‘ื™ืŸ ืืช ื–ื” ืกืชื ื›ื™ื ื•ื™ ื›ื–ื” ืžื‘ื—ื™ื ืชื ื•, ืœืฆืจื›ื™ ื”ืฉื•ื•ืื” ืœืชื•ื›ื ื™ืช, ื–ื” ืœื ื”ื’ื™ื•ื ื™, ื–ื” ืคืฉื•ื˜ ืžืชื•ื•ืกืฃ ื›ืืŸ. ื‘ื•ืื• ืœื ื ืฉื™ื ืœื‘ ืืœื™ื•.

ื‘ ืžืฉื™ืžื” "ืขื ื›ื•ื›ื‘ื™ืช": ืื ืื ื• ืงื•ืจืื™ื ืžื˜ื‘ืœื” ืžื—ื•ืœืงืช, ื ืงื‘ืœ ืฆื•ืžืช Append ืื• Merge Append, ืฉื™ื•ืจื›ื‘ ืžืžืกืคืจ ืจื‘ ืฉืœ "ื™ืœื“ื™ื", ื•ื›ืœ ืื—ื“ ืžื”ื ื™ื”ื™ื” ืื™ื›ืฉื”ื• Scanืื•ื ืžืงื˜ืข ื”ื˜ื‘ืœื”: Seq Scan, Bitmap Heap Scan ืื• Index Scan. ืื‘ืœ, ื‘ื›ืœ ืžืงืจื”, "ื™ืœื“ื™ื" ืืœื” ืœื ื™ื”ื™ื• ืฉืื™ืœืชื•ืช ืžื•ืจื›ื‘ื•ืช - ื›ืš ื ื™ืชืŸ ืœื”ื‘ื—ื™ืŸ ื‘ื™ืŸ ื”ืฆืžืชื™ื ื”ืœืœื• ืœื‘ื™ืŸ Append ะฟั€ะธ UNION.
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ืื ื—ื ื• ื’ื ืžื‘ื™ื ื™ื ืงืฉืจื™ื ื›ืืœื”, ืื•ืกืคื™ื ืื•ืชื "ื‘ืขืจื™ืžื” ืื—ืช" ื•ืื•ืžืจื™ื: "ื›ืœ ืžื” ืฉืืชื” ืงื•ืจื ืž-megatable ื ืžืฆื ื›ืืŸ ื•ื‘ื”ืžืฉืš ื”ืขืฅ".

ืฆืžืชื™ื "ืคืฉื•ื˜ื™ื" ืœืงื‘ืœืช ื ืชื•ื ื™ื

PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

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.
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ืกื™ื•ืžื•ืช "ืžืžื•ืกืคืจื•ืช" ื™ืขื–ืจื• ืœื”ื‘ื—ื™ืŸ ื‘ื™ื ื™ื”ืŸ - ื”ืŸ ืžืชื•ื•ืกืคื•ืช ื‘ื“ื™ื•ืง ื‘ืกื“ืจ ืฉื‘ื• ื ืžืฆืื•ืช ื”ืชื•ืืžื•ืช VALUES-ื‘ืœื•ืงื™ื ืœืื•ืจืš ื”ื‘ืงืฉื” ืžืœืžืขืœื” ืœืžื˜ื”.

ืขื™ื‘ื•ื“ ื ืชื•ื ื™ื

ื ืจืื” ืฉื”ื›ืœ ื‘ื‘ืงืฉืชื ื• ืžืกื•ื“ืจ - ื›ืœ ืžื” ืฉื ื•ืชืจ ื”ื•ื Limit.
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ืื‘ืœ ื›ืืŸ ื”ื›ืœ ืคืฉื•ื˜ - ืฆืžืชื™ื ื›ืžื• Limit, Sort, Aggregate, WindowAgg, Unique "ืžืคื”" ืื—ื“ ืœืื—ื“ ืœืžืคืขื™ืœื™ื ื”ืžืชืื™ืžื™ื ื‘ื‘ืงืฉื”, ืื ื”ื ืฉื. ืื™ืŸ ื›ืืŸ "ื›ื•ื›ื‘ื™ื" ืื• ืงืฉื™ื™ื.
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ืœื”ืฆื˜ืจืฃ

ืงืฉื™ื™ื ืžืชืขื•ืจืจื™ื ื›ืืฉืจ ืื ื• ืจื•ืฆื™ื ืœืฉืœื‘ JOIN ื‘ื™ื ื ืœื‘ื™ืŸ ืขืฆืžื. ื–ื” ืœื ืชืžื™ื“ ืืคืฉืจื™, ืื‘ืœ ื–ื” ืืคืฉืจื™.
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ืžื ืงื•ื“ืช ื”ืžื‘ื˜ ืฉืœ ืžื ืชื— ื”ืฉืื™ืœืชื•ืช, ื™ืฉ ืœื ื• ืฆื•ืžืช JoinExpr, ืฉื™ืฉ ืœื• ื‘ื“ื™ื•ืง ืฉื ื™ ื™ืœื“ื™ื - ืฉืžืืœ ื•ื™ืžื™ืŸ. ื–ื”, ื‘ื”ืชืื, ื”ื•ื ืžื” ืฉ"ืžืขืœ" ื”-JOIN ืฉืœืš ื•ืžื” ืฉื›ืชื•ื‘ "ืžืชื—ืชื™ื•" ื‘ื‘ืงืฉื”.

ื•ืžื‘ื—ื™ื ืช ื”ืชื›ื ื™ืช ืžื“ื•ื‘ืจ ื‘ืฉื ื™ ืฆืืฆืื™ื ืฉืœ ื—ืœืงื * Loop/* Join-ืฆื•ึนืžึถืช. Nested Loop, Hash Anti Join,... - ืžืฉื”ื• ื›ื–ื”.

ื‘ื•ืื• ื ืฉืชืžืฉ ื‘ืœื•ื’ื™ืงื” ืคืฉื•ื˜ื”: ืื ื™ืฉ ืœื ื• ื˜ื‘ืœืื•ืช A ื•-B ืฉ"ืžืฆื˜ืจืคื•ืช" ื–ื• ืœื–ื• ื‘ืชื•ื›ื ื™ืช, ืื– ื‘ื‘ืงืฉื” ื”ืŸ ื™ื›ื•ืœื•ืช ืœื”ื™ื•ืช ืžืžื•ืงืžื•ืช ืื• A-JOIN-Bืื• B-JOIN-A. ื ื ืกื” ืœืฉืœื‘ ื›ืš, ื ื ืกื” ืœืฉืœื‘ ื”ืคื•ืš, ื•ื›ืš ื”ืœืื” ืขื“ ืฉื™ื™ื’ืžืจื• ืœื ื• ื–ื•ื’ื•ืช ื›ืืœื”.

ื‘ื•ืื• ื ื™ืงื— ืืช ืขืฅ ื”ืชื—ื‘ื™ืจ ืฉืœื ื•, ื ื™ืงื— ืืช ื”ืชื•ื›ื ื™ืช ืฉืœื ื•, ื ืกืชื›ืœ ืขืœื™ื”ื... ืœื ื“ื•ืžื™ื!
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ื‘ื•ืื• ื ืฆื™ื™ืจ ืืช ื–ื” ืžื—ื“ืฉ ื‘ืฆื•ืจื” ืฉืœ ื’ืจืคื™ื - ื”ื•, ื–ื” ื›ื‘ืจ ื ืจืื” ื›ืžื• ืžืฉื”ื•!
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ื ืฉื™ื ืœื‘ ืฉื™ืฉ ืœื ื• ืฆืžืชื™ื ืฉื™ืฉ ืœื”ื ื‘ื• ื–ืžื ื™ืช ื™ืœื“ื™ื ื‘' ื•-ื’' - ืœื ืื›ืคืช ืœื ื• ื‘ืื™ื–ื” ืกื“ืจ. ื‘ื•ืื• ื ืฉืœื‘ ืื•ืชื ื•ื ื”ืคื•ืš ืืช ื”ืชืžื•ื ื” ืฉืœ ื”ืฆื•ืžืช.
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ื‘ื•ืื• ื ืกืชื›ืœ ืฉื•ื‘. ื›ืขืช ื™ืฉ ืœื ื• ืฆืžืชื™ื ืขื ื™ืœื“ื™ื A ื•ื–ื•ื’ื•ืช (B + C) - ืชื•ืืžื™ื ื’ื ืืœื™ื”ื.
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ื’ื“ื•ืœ! ืžืกืชื‘ืจ ืฉืื ื—ื ื• ื”ืฉื ื™ื™ื ื”ืืœื” JOIN ืžื”ื‘ืงืฉื” ืขื ื”ืชื•ื›ื ื™ืช ืฆืžืชื™ื ืฉื•ืœื‘ื• ื‘ื”ืฆืœื—ื”.

ืื‘ื•ื™, ื‘ืขื™ื” ื–ื• ืœื ืชืžื™ื“ ื ืคืชืจืช.
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ืœืžืฉืœ, ืื ื‘ืžืกื’ืจืช ื‘ืงืฉื” A JOIN B JOIN C, ื•ื‘ืชื›ื ื™ืช ืงื•ื“ื ื›ืœ ื”ืชื—ื‘ืจื• ื”ืฆืžืชื™ื ื”"ื—ื™ืฆื•ื ื™ื™ื" A ื•- C. ืื‘ืœ ืื™ืŸ ืžืคืขื™ืœ ื›ื–ื” ื‘ื‘ืงืฉื”, ืื™ืŸ ืœื ื• ืžื” ืœื”ื“ื’ื™ืฉ, ืื™ืŸ ืžื” ืœืฆืจืฃ ืจืžื–. ื–ื” ืื•ืชื• ื“ื‘ืจ ืขื ื”"ืคืกื™ืง" ื›ืฉืืชื” ื›ื•ืชื‘ A, B.

ืื‘ืœ, ื‘ืจื•ื‘ ื”ืžืงืจื™ื, ื›ืžืขื˜ ื›ืœ ื”ืฆืžืชื™ื ื ื™ืชื ื™ื ืœ"ื”ืชืจืช ืงืฉืจ" ื•ืชื•ื›ืœื• ืœืงื‘ืœ ืกื•ื’ ื–ื” ืฉืœ ืคืจื•ืคื™ืœ ื‘ืฆื“ ืฉืžืืœ ื‘ื–ืžืŸ - ืคืฉื•ื˜ื• ื›ืžืฉืžืขื•, ื›ืžื• ื‘ื’ื•ื’ืœ ื›ืจื•ื ื›ืฉืืชื ืžื ืชื—ื™ื ืงื•ื“ JavaScript. ืืชื” ื™ื›ื•ืœ ืœืจืื•ืช ื›ืžื” ื–ืžืŸ ืœืงื— ื›ืœ ืฉื•ืจื” ื•ื›ืœ ื”ืฆื”ืจื” "ืœื”ื•ืฆื™ื ืœืคื•ืขืœ".
PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ื•ื›ื“ื™ ืฉื™ื”ื™ื” ืœืš ื ื•ื— ื™ื•ืชืจ ืœื”ืฉืชืžืฉ ื‘ื›ืœ ื–ื”, ื™ืฆืจื ื• ืื—ืกื•ืŸ ืืจื›ื™ื•ืŸ, ืฉื‘ื• ืชื•ื›ืœ ืœืฉืžื•ืจ ื•ืœืžืฆื•ื ืžืื•ื—ืจ ื™ื•ืชืจ ืืช ื”ืชื•ื›ื ื™ื•ืช ืฉืœืš ื™ื—ื“ ืขื ื‘ืงืฉื•ืช ื”ืงืฉื•ืจื•ืช ืื• ืœืฉืชืฃ ืืช ื”ืงื™ืฉื•ืจ ืขื ืžื™ืฉื”ื•.

ืื ืืชื” ืจืง ืฆืจื™ืš ืœื”ื‘ื™ื ืฉืื™ืœืชื” ื‘ืœืชื™ ืงืจื™ืื” ืœืฆื•ืจื” ื ืื•ืชื”, ื”ืฉืชืžืฉ ื”"ื ืจืžืœื™ื–ืจ" ืฉืœื ื•.

PostgreSQL Query Profiler: ื›ื™ืฆื“ ืœื”ืชืื™ื ืชื•ื›ื ื™ืช ืœืฉืื™ืœืชื”

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”