Π—Π° ΠΊΠ°ΠΊΠ²ΠΎ ΠΌΡŠΠ»Ρ‡ΠΈ 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"

Но Ρ‡Π΅Ρ‚Π΅Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΠ»Π°Π½Π° тСкстово β€žΠ½Π° Π»ΠΈΡΡ‚β€œ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ слоТно ΠΈ нСясно:

  • във възСла сС ΠΈΠ·Π²Π΅ΠΆΠ΄Π° сумата ΠΏΠΎ рСсурситС Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎΡ‚ΠΎ
    тоСст Π·Π° Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ ΠΊΠΎΠ»ΠΊΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π΅ ΠΎΡ‚Π½Π΅Π»ΠΎ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ възСл, ΠΈΠ»ΠΈ ΠΊΠΎΠ»ΠΊΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚ΠΎΠ²Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ ΠΎΡ‚ Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° Π΅ извлякло Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ диска – трябва ΠΏΠΎ някакъв Π½Π°Ρ‡ΠΈΠ½ Π΄Π° ΠΈΠ·Π²Π°Π΄ΠΈΡ‚Π΅ Π΅Π΄Π½ΠΎ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎ
  • Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° възСла Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° сС ΡƒΠΌΠ½ΠΎΠΆΠ°Π²Π° ΠΏΠΎ Ρ†ΠΈΠΊΠ»ΠΈ
    Π”Π°, ΠΈΠ·Π²Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ всС ΠΎΡ‰Π΅ Π½Π΅ Π΅ Π½Π°ΠΉ-слоТната опСрация, която трябва Π΄Π° сС ΠΏΡ€Π°Π²ΠΈ β€žΠ² ΡƒΠΌΠ°β€œ β€” Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° изпълнСниС Π΅ посочСно срСдно Π·Π° Π΅Π΄Π½ΠΎ изпълнСниС Π½Π° възСл, Π° Ρ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ стотици.
  • Но всичко Ρ‚ΠΎΠ²Π° Π·Π°Π΅Π΄Π½ΠΎ затруднява ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π° Π½Π° основния Π²ΡŠΠΏΡ€ΠΎΡ β€” Ρ‚Π°ΠΊΠ° ΠΊΠΎΠΉ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π΅. β€žΠΠ°ΠΉ-слабата Π²Ρ€ΡŠΠ·ΠΊΠ°β€œ?

ΠšΠΎΠ³Π°Ρ‚ΠΎ сС ΠΎΠΏΠΈΡ‚Π°Ρ…ΠΌΠ΅ Π΄Π° обясним всичко Ρ‚ΠΎΠ²Π° Π½Π° няколко стотин наши Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈ, Ρ€Π°Π·Π±Ρ€Π°Ρ…ΠΌΠ΅, Ρ‡Π΅ отстрани Ρ‚ΠΎΠ²Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ слСдния Π½Π°Ρ‡ΠΈΠ½:

Π—Π° ΠΊΠ°ΠΊΠ²ΠΎ ΠΌΡŠΠ»Ρ‡ΠΈ 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 ΠΈ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΎ Π½Π°ΠΊΠ°Ρ€Π°ΠΌΠ΅ Π΄Π° Π³ΠΎΠ²ΠΎΡ€ΠΈ

Но Π°ΠΊΠΎ ΠΏΠ»Π°Π½ΡŠΡ‚ Π΅ ΠΏΠΎ-слоТСн β€” Π½Π° ΠΏΠΎΠΌΠΎΡ‰ ΠΈΠ΄Π²Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠ° Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ ΠΏΠΎ възли:

Π—Π° ΠΊΠ°ΠΊΠ²ΠΎ ΠΌΡŠΠ»Ρ‡ΠΈ 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

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster