О Ρ‡Π΅ΠΌ ΠΌΠΎΠ»Ρ‡ΠΈΡ‚ EXPLAIN, ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ

ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠΉ вопрос, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ ΠΊ своСму DBA ΠΈΠ»ΠΈ Π²Π»Π°Π΄Π΅Π»Π΅Ρ† бизнСса β€” ΠΊ ΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚Π°Π½Ρ‚Ρƒ ΠΏΠΎ PostgreSQL, ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда Π·Π²ΡƒΡ‡ΠΈΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ: Β«ΠŸΠΎΡ‡Π΅ΠΌΡƒ запросы Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π½Π° Π±Π°Π·Π΅ Ρ‚Π°ΠΊ Π΄ΠΎΠ»Π³ΠΎ?Β»

Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ΠΏΡ€ΠΈΡ‡ΠΈΠ½:

  • нСэффСктивный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ
    ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ JOIN Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… CTE ΠΏΠΎ ΠΏΠ°Ρ€Π΅ дСсятков тысяч записСй
  • Π½Π΅Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ статистика
    Ссли фактичСскоС распрСдСлСниС Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΡƒΠΆΠ΅ сильно отличаСтся ΠΎΡ‚ собранной ANALYZE’ΠΎΠΌ Π² послСдний Ρ€Π°Π·
  • Β«Π·Π°Ρ‚Ρ‹ΠΊΒ» ΠΏΠΎ рСсурсам
    ΠΈ ΡƒΠΆΠ΅ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… мощностСй CPU, постоянно ΠΏΡ€ΠΎΠΊΠ°Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚Ρ‹ памяти ΠΈΠ»ΠΈ диск Π½Π΅ успСваСт Π·Π° всСми Β«Ρ…ΠΎΡ‚Π΅Π»ΠΊΠ°ΠΌΠΈΒ» Π‘Π”
  • Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… процСссов

И Ссли Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ достаточно слоТны Π² ΠΏΠΎΠΈΠΌΠΊΠ΅ ΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅, Ρ‚ΠΎ для всСго ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π½Π°ΠΌ достаточно ΠΏΠ»Π°Π½Π° запроса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° EXPLAIN (Π»ΡƒΡ‡ΡˆΠ΅, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, сразу EXPLAIN (ANALYZE, BUFFERS) …) ΠΈΠ»ΠΈ модуля auto_explain.

Но, ΠΊΠ°ΠΊ сказано Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ,

«ПониманиС ΠΏΠ»Π°Π½Π° β€” это искусство, ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ²Π»Π°Π΄Π΅Ρ‚ΡŒ ΠΈΠΌ, Π½ΡƒΠΆΠ΅Π½ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ ΠΎΠΏΡ‹Ρ‚, …»

Но ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ ΠΈ Π±Π΅Π· Π½Π΅Π³ΠΎ, Ссли Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ подходящим инструмСнтом!

Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ выглядит ΠΏΠ»Π°Π½ запроса? Как-Ρ‚ΠΎ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

Index Scan using pg_class_relname_nsp_index on pg_class (actual time=0.049..0.050 rows=1 loops=1)
  Index Cond: (relname = $1)
  Filter: (oid = $0)
  Buffers: shared hit=4
  InitPlan 1 (returns $0,$1)
    ->  Limit (actual time=0.019..0.020 rows=1 loops=1)
          Buffers: shared hit=1
          ->  Seq Scan on pg_class pg_class_1 (actual time=0.015..0.015 rows=1 loops=1)
                Filter: (relkind = 'r'::"char")
                Rows Removed by Filter: 5
                Buffers: shared hit=1

ΠΈΠ»ΠΈ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

"Append  (cost=868.60..878.95 rows=2 width=233) (actual time=0.024..0.144 rows=2 loops=1)"
"  Buffers: shared hit=3"
"  CTE cl"
"    ->  Seq Scan on pg_class  (cost=0.00..868.60 rows=9972 width=537) (actual time=0.016..0.042 rows=101 loops=1)"
"          Buffers: shared hit=3"
"  ->  Limit  (cost=0.00..0.10 rows=1 width=233) (actual time=0.023..0.024 rows=1 loops=1)"
"        Buffers: shared hit=1"
"        ->  CTE Scan on cl  (cost=0.00..997.20 rows=9972 width=233) (actual time=0.021..0.021 rows=1 loops=1)"
"              Buffers: shared hit=1"
"  ->  Limit  (cost=10.00..10.10 rows=1 width=233) (actual time=0.117..0.118 rows=1 loops=1)"
"        Buffers: shared hit=2"
"        ->  CTE Scan on cl cl_1  (cost=0.00..997.20 rows=9972 width=233) (actual time=0.001..0.104 rows=101 loops=1)"
"              Buffers: shared hit=2"
"Planning Time: 0.634 ms"
"Execution Time: 0.248 ms"

Но Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠ»Π°Π½ тСкстом «с листа» β€” ΠΎΡ‡Π΅Π½ΡŒ слоТно ΠΈ нСнаглядно:

  • Π² ΡƒΠ·Π»Π΅ выводится сумма ΠΏΠΎ рСсурсам ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π°
    Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, сколько ΡƒΡˆΠ»ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°, ΠΈΠ»ΠΈ сколько ΠΈΠΌΠ΅Π½Π½ΠΎ Π²ΠΎΡ‚ это Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ подняло Π΄Π°Π½Π½Ρ‹Ρ… с диска β€” Π½ΡƒΠΆΠ½ΠΎ ΠΊΠ°ΠΊ-Ρ‚ΠΎ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ
  • врСмя ΡƒΠ·Π»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΌΠ½ΠΎΠΆΠ°Ρ‚ΡŒ Π½Π° loops
    Π΄Π°, Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ Π΅Ρ‰Π΅ Π½Π΅ самая слоТная опСрация, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π°Π΄ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Β«Π² ΡƒΠΌΠ΅Β» β€” вСдь врСмя выполнСния указываСтся усрСднСнноС для ΠΎΠ΄Π½ΠΎΠ³ΠΎ выполнСния ΡƒΠ·Π»Π°, Π° ΠΈΡ… ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ сотни
  • Π½Ρƒ, ΠΈ всС это вмСстС ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° Π³Π»Π°Π²Π½Ρ‹ΠΉ вопрос β€” Ρ‚Π°ΠΊ ΠΊΡ‚ΠΎ ΠΆΠ΅ «самоС слабоС Π·Π²Π΅Π½ΠΎΒ»?

Когда ΠΌΡ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ всС это нСскольким сотням Π½Π°ΡˆΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², Ρ‚ΠΎ поняли, Ρ‡Ρ‚ΠΎ со стороны это выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

О Ρ‡Π΅ΠΌ ΠΌΠΎΠ»Ρ‡ΠΈΡ‚ EXPLAIN, ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ

А, Π·Π½Π°Ρ‡ΠΈΡ‚, Π½Π°ΠΌ нуТСн…

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚

Π’ Π½Π΅ΠΌ ΠΌΡ‹ ΠΏΠΎΡΡ‚Π°Ρ€Π°Π»ΠΈΡΡŒ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ всС ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΠΏΠΎ ΠΏΠ»Π°Π½Ρƒ ΠΈ запросу ΠΏΠΎΠ½ΡΡ‚ΡŒ, Β«ΠΊΡ‚ΠΎ Π²ΠΈΠ½ΠΎΠ²Π°Ρ‚ ΠΈ Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒΒ». Ну, ΠΈ Ρ‡Π°ΡΡ‚ΡŒΡŽ своСго ΠΎΠΏΡ‹Ρ‚Π° ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ с сообщСством.
ВстрСчайтС ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ β€” explain.tensor.ru

ΠΠ°Π³Π»ΡΠ΄Π½ΠΎΡΡ‚ΡŒ ΠΏΠ»Π°Π½ΠΎΠ²

Π›Π΅Π³ΠΊΠΎ Π»ΠΈ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΠ»Π°Π½, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ выглядит Ρ‚Π°ΠΊ?

Seq Scan on pg_class (actual time=0.009..1.304 rows=6609 loops=1)
  Buffers: shared hit=263
Planning Time: 0.108 ms
Execution Time: 1.800 ms

НС ΠΎΡ‡Π΅Π½ΡŒ.

Но Π²ΠΎΡ‚ Ρ‚Π°ΠΊ, Π² сокращСнном Π²ΠΈΠ΄Π΅, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΎΡ‚Π΄Π΅Π»Π΅Π½Ρ‹ β€” ΡƒΠΆΠ΅ Π³ΠΎΡ€Π°Π·Π΄ΠΎ понятнСС:

О Ρ‡Π΅ΠΌ ΠΌΠΎΠ»Ρ‡ΠΈΡ‚ EXPLAIN, ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ

Но Ссли ΠΏΠ»Π°Π½ послоТнСС β€” Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ piechart распрСдСлСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠΎ ΡƒΠ·Π»Π°ΠΌ:

О Ρ‡Π΅ΠΌ ΠΌΠΎΠ»Ρ‡ΠΈΡ‚ EXPLAIN, ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ

Ну, Π° для самых слоТных Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ ΡΠΏΠ΅ΡˆΠΈΡ‚ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° выполнСния:

О Ρ‡Π΅ΠΌ ΠΌΠΎΠ»Ρ‡ΠΈΡ‚ EXPLAIN, ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ

НапримСр, Π±Ρ‹Π²Π°ΡŽΡ‚ достаточно Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ситуации, ΠΊΠΎΠ³Π΄Π° ΠΏΠ»Π°Π½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ фактичСского корня:

О Ρ‡Π΅ΠΌ ΠΌΠΎΠ»Ρ‡ΠΈΡ‚ EXPLAIN, ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒΠž Ρ‡Π΅ΠΌ ΠΌΠΎΠ»Ρ‡ΠΈΡ‚ EXPLAIN, ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π½Ρ‹Π΅ подсказки

Ну, Π° Ссли вся структура ΠΏΠ»Π°Π½Π° ΠΈ Π΅Π³ΠΎ Π±ΠΎΠ»ΡŒΠ½Ρ‹Π΅ мСста ΡƒΠΆΠ΅ Ρ€Π°Π·Π»ΠΎΠΆΠ΅Π½Ρ‹ ΠΈ Π²ΠΈΠ΄Π½Ρ‹ β€” ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ Π½Π΅ ΠΏΠΎΠ΄ΡΠ²Π΅Ρ‚ΠΈΡ‚ΡŒ ΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ, ΠΈ Π½Π΅ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ «русским языком»?

О Ρ‡Π΅ΠΌ ΠΌΠΎΠ»Ρ‡ΠΈΡ‚ EXPLAIN, ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒΠ’Π°ΠΊΠΈΡ… шаблонов Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ ΠΌΡ‹ собрали ΡƒΠΆΠ΅ ΠΏΠ°Ρ€Ρƒ дСсятков.

ΠŸΠΎΡΡ‚Ρ€ΠΎΡ‡Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ„Π°ΠΉΠ»Π΅Ρ€ запроса

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли Π½Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΠ»Π°Π½ Π½Π°Π»ΠΎΠΆΠΈΡ‚ΡŒ исходный запрос, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΡƒΡˆΠ»ΠΎ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ β€” ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

О Ρ‡Π΅ΠΌ ΠΌΠΎΠ»Ρ‡ΠΈΡ‚ EXPLAIN, ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ

… ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Ρ‚Π°ΠΊ:

О Ρ‡Π΅ΠΌ ΠΌΠΎΠ»Ρ‡ΠΈΡ‚ EXPLAIN, ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ

ΠŸΠΎΠ΄ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² запрос

Если Π²Ρ‹ Β«ΠΏΡ€ΠΈΡ†Π΅ΠΏΠΈΠ»ΠΈΒ» ΠΊ ΠΏΠ»Π°Π½Ρƒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ запрос, Π½ΠΎ ΠΈ Π΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈΠ· DETAIL-строки Π»ΠΎΠ³Π°, Ρ‚ΠΎ смоТСтС ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ²:

  • с подстановкой Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² запрос
    для нСпосрСдствСнного выполнСния Π½Π° своСй Π±Π°Π·Π΅ ΠΈ дальнСйшСй ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²ΠΊΠΈ

    SELECT 'const', 'param'::text;
  • с подстановкой Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‡Π΅Ρ€Π΅Π· PREPARE/EXECUTE
    для эмуляции Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ°, ΠΊΠΎΠ³Π΄Π° парамСтричСская Ρ‡Π°ΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½Π° β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ Π½Π° сСкционированных Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ…

    DEALLOCATE ALL;
    PREPARE q(text) AS SELECT 'const', $1::text;
    EXECUTE q('param'::text);
    

Архив ΠΏΠ»Π°Π½ΠΎΠ²

ВставляйтС, Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅, Π΄Π΅Π»ΠΈΡ‚Π΅ΡΡŒ с ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌΠΈ! ΠŸΠ»Π°Π½Ρ‹ останутся Π² Π°Ρ€Ρ…ΠΈΠ²Π΅, ΠΈ Π²Ρ‹ смоТСтС Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ Π½ΠΈΠΌ ΠΏΠΎΠ·Π΄Π½Π΅Π΅: explain.tensor.ru/archive

Но Ссли Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ваш ΠΏΠ»Π°Π½ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅, Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π³Π°Π»ΠΎΡ‡ΠΊΡƒ Β«Π½Π΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ Π² Π°Ρ€Ρ…ΠΈΠ²Π΅Β».

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΡΡ‚Π°Ρ‚ΡŒΡΡ… я расскаТу ΠΎ Ρ‚Π΅Ρ… слоТностях ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΡ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΏΡ€ΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅ ΠΏΠ»Π°Π½Π°.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com