Ang klasiko nga pangutana nga ipangutana sa usa ka developer sa ilang DBA o sa usa ka tag-iya sa negosyo sa usa ka consultant sa PostgreSQL halos kanunay parehas: "Ngano nga dugay man kaayo ma-execute ang mga query sa database?"
Tradisyonal nga hugpong sa mga hinungdan:
- dili episyente nga algorithm
kon modesisyon ka nga APIL sa daghang CTE sa pipila ka napulo ka libo nga mga rekord - walay kalabotan nga estadistika
kon ang aktuwal nga distribusyon sa datos sa talaan lahi na kaayo sa nakolekta sa ANALYZE sa miaging higayon - "plug" sa mga kapanguhaan
ug wala nay igong dedikado nga CPU computing power, ang mga gigabytes sa memorya kanunay nga gibomba, o ang disk dili makaapas sa tanang "gusto" sa database. - pagbabag gikan sa mga proseso nga nakigkompetensya
Ug kon ang pag-block lisod kaayo nga madakpan ug ma-analisa, nan para sa tanan nga uban pa, ang kinahanglan lang nato plano sa pangutana, nga makuha gamit ang (Mas maayo, siyempre, nga ipasabot dayon (analyze, buffers) …) o .
Apan, sama sa giingon sa parehas nga dokumentasyon,
"Ang pagsabot sa usa ka plano usa ka arte, ug aron ma-master kini nanginahanglan usa ka piho nga gidaghanon sa kasinatian, ..."
Apan mahimo nimo kung wala kini kung mogamit ka sa husto nga himan!
Unsa ang kasagarang hitsura sa usa ka plano sa pangutana? Murag ingon ani:
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=1o sama niini:
"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"Apan ang pagbasa sa plano gikan sa wala lisod kaayo ug dili sayon sabton:
- gipakita sa node suma sa mga kahinguhaan sa subtree
buot ipasabot, aron masabtan kung pila ka oras ang gikinahanglan aron mapatuman ang usa ka piho nga node, o kung pila ka datos ang eksaktong nakuha gikan sa lamesa gikan sa disk, kinahanglan nimo nga i-iban ang usa gikan sa lain. - gikinahanglan ang oras sa node padaghanon pinaagi sa mga galong
Oo, ang pag-iban dili ang pinakalisod nga operasyon nga buhaton "sa imong ulo" - kay ang oras sa pagpatuman gipakita isip aberids alang sa usa ka pagpatuman sa usa ka node, ug mahimong adunay gatusan niini. - Aw, kining tanan nagpugong kanato sa pagtubag sa pangunang pangutana - kinsa man ang pinakahuyang nga sumpay?
Sa dihang among gisulayan pagpasabot kining tanan ngadto sa gatusan sa among mga developer, among naamgohan nga gikan sa gawas kini morag ingon niini:

Ug kana nagpasabot nga kinahanglan nato…
Galamiton
Niini, among gisulayan nga kolektahon ang tanang importanteng mekanismo nga makatabang kanamo sa pagsabot, base sa plano ug hangyo, "kinsa ang mabasol ug unsay buhaton." Ug, siyempre, among gipaambit ang pipila sa among mga kasinatian sa komunidad.
Magkita ta ug maglipay -
Pagkakita sa mga plano
Sayon ra ba sabton ang usa ka plano kung ingon ani ang hitsura?
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
Dili gyud.
Pero mao gyud na, sa mubo nga porma, kon ang mga importanteng timailhan gibulag, mas klaro kini:

Apan kon mas komplikado ang plano, moabot ang tabang piechart sa pag-apod-apod sa oras pinaagi sa mga node:

Aw, alang sa labing lisud nga mga kapilian, midali siya sa pagluwas dayagram sa pagpatuman:

Pananglitan, adunay mga sitwasyon nga dili kaayo importante diin ang usa ka plano mahimong adunay labaw sa usa ka tinuod nga hinungdan:


Mga timailhan sa istruktura
Aw, kon ang tibuok istruktura sa plano ug ang mga kahuyang niini nahan-ay na ug makita na, nganong dili man kini ipasiugda sa developer ug ipasabut sa yanong Iningles?
Nakakolekta na mi og pipila ka dosena niining mga template sa rekomendasyon.
Profiler sa pangutana matag laray
Karon, kon imong i-overlay ang orihinal nga pangutana sa plano nga gisusi, imong makita kon pila ka oras ang gigugol sa matag indibidwal nga operator—sama niini:

...o bisan ingon ani:

Pag-ilis sa mga parameter ngadto sa usa ka pangutana
Kon imong gilakip dili lang ang pangutana apan lakip na usab ang mga parameter niini gikan sa DETAIL nga linya sa log ngadto sa plano, mahimo nimo kining kopyahon dugang gamit ang usa sa mosunod nga mga kapilian:
- uban ang pag-ilis sa mga kantidad sa pangutana
para sa direktang pagpatuman sa kaugalingon nga base ug dugang nga pag-profileSELECT 'const', 'param'::text; - uban ang pag-ilis sa mga kantidad pinaagi sa PREPARE/EXECUTE
aron sundogon ang trabaho sa scheduler, kung ang parametric nga bahin mahimong ibaliwala - pananglitan, kung nagtrabaho sa mga partitioned tablesDEALLOCATE ALL; PREPARE q(text) AS SELECT 'const', $1::text; EXECUTE q('param'::text);
Arkibos sa mga plano
Idikit, analisaha, ug ipaambit sa mga kauban! Ang imong mga plano magpabilin sa archive, ug mahimo nimo kini balikan sa ulahi:
Apan kon dili nimo gusto nga makita sa uban ang imong plano, ayaw kalimti ang pag-tsek sa kahon nga "ayaw i-publish sa archive".
Sa mosunod nga mga artikulo, akong hisgutan ang mga hagit ug solusyon nga motumaw sa pag-analisar sa usa ka plano.
Source: www.habr.com
