Ny atao hoe EXPLAIN dia mangina sy ny fomba ahazoana azy miresaka

Ny fanontaniana mahazatra izay entin'ny developer amin'ny DBA-ny, na entin'ny tompona orinasa amin'ny consultant PostgreSQL, dia saika mitovy foana ny feo: "Nahoana no maharitra ela ny fangatahana amin'ny angon-drakitra?"

Antony nentim-paharazana:

  • algorithm tsy mahomby
    rehefa manapa-kevitra ny hiditra amin'ny CTE maromaro ianao amin'ny firaketana an'aliny roa
  • antontan'isa tsy misy ifandraisany
    raha toa ka efa tsy mitovy amin'ilay nangonin'ny ANALYZE farany teo ny tena fitsinjarana ny angona ao anaty tabilao
  • "plug" amin'ny loharano
    ary tsy ampy intsony ny herin'ny informatika natokana ho an'ny CPU, ny fitadidiana gigabytes tsy mitsaha-mitombo, na ny kapila tsy afaka maharaka ny "faniriana" rehetra amin'ny angon-drakitra.
  • fanakanana avy amin'ny dingana mifaninana

Ary raha toa ka sarotra ny maka sy manadihady ny fanakanana, dia ho an'ny zavatra hafa rehetra ilaintsika drafi-panontaniana, izay azo alaina amin'ny fampiasana FANAZAVANA operator (Tsara kokoa, mazava ho azy, avy hatrany ny MANAZAVA (ANALYZE, BUFFERS) ...) na auto_explain module.

Saingy, araka ny voalaza ao amin'io antontan-taratasy io ihany,

"Kanto ny fahafantarana ny drafitra, ary mila traikefa manokana ny mahafehy azy..."

Saingy afaka manao tsy misy izany ianao raha mampiasa fitaovana mety!

Manao ahoana ny endriky ny drafitry ny fangatahana? Zavatra toy izany:

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

na toy izao:

"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"

Fa ny famakiana ny drafitra amin'ny lahatsoratra "avy amin'ny takelaka" dia tena sarotra sy tsy mazava:

  • dia aseho ao amin'ny node fitambaran'ny loharanon-kazo
    izany hoe, mba hahatakarana hoe ohatrinona ny fotoana nahafahan'ny node iray manokana, na hoe ohatrinona marina io famakiana avy amin'ny latabatra io no nampiakatra angona avy amin'ny kapila, mila manaisotra ny iray amin'ny iray hafa ianao.
  • mila fotoana node ampitomboy tadivavarana
    Eny, ny fanalana dia tsy ny asa sarotra indrindra izay tsy maintsy atao "ao amin'ny loha" - na izany aza, ny fotoana famonoana dia aseho ho salan'isa ho an'ny famonoana ny node iray, ary mety ho an-jatony izy ireo.
  • tsara, ary izany rehetra izany miaraka manakana antsika tsy hamaly ny tena fanontaniana - ka iza "ilay rohy malemy indrindra"?

Rehefa nanandrana nanazava izany rehetra izany tamin'ireo mpamorona anay an-jatony izahay, dia nahatsapa izahay fa avy any ivelany dia toa izao:

Ny atao hoe EXPLAIN dia mangina sy ny fomba ahazoana azy miresaka

Ary midika izany fa mila...

fitaovana

Tao anatin'izany dia niezaka nanangona ny mekanika fototra rehetra izay manampy amin'ny fahatakarana ny "iza no tokony homena tsiny sy ny tokony hatao" araka ny drafitra sy ny fangatahana. Eny ary, zarao ny ampahany amin'ny traikefanao amin'ny fiarahamonina.
Hihaona sy hampiasa- explain.tensor.ru

Ny fahitana ny drafitra

Mora azo ve ny drafitra rehefa toa izao?

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

Tsy tena izy.

Fa toy izao, amin'ny endrika fanafohezanarehefa misaraka ireo tondro fototra dia mazava kokoa izany:

Ny atao hoe EXPLAIN dia mangina sy ny fomba ahazoana azy miresaka

Fa raha sarotra kokoa ny drafitra, dia ho avy hamonjy fizarana fotoana piechart amin'ny nodes:

Ny atao hoe EXPLAIN dia mangina sy ny fomba ahazoana azy miresaka

Eny ary, ho an'ny safidy sarotra indrindra izy dia maika hanampy tabilao fandrosoana:

Ny atao hoe EXPLAIN dia mangina sy ny fomba ahazoana azy miresaka

Ohatra, misy toe-javatra tsy dia misy dikany raha toa ka misy fotony mihoatra ny iray ny drafitra iray:

Ny atao hoe EXPLAIN dia mangina sy ny fomba ahazoana azy miresakaNy atao hoe EXPLAIN dia mangina sy ny fomba ahazoana azy miresaka

Famantarana ara-drafitra

Eny, raha toa ka efa napetraka sy hita maso ny firafitry ny drafitra iray manontolo sy ny faritra marary, maninona raha asongadino amin'ny mpamorona izy ireo ary hazavaina amin'ny "fiteny Rosiana"?

Ny atao hoe EXPLAIN dia mangina sy ny fomba ahazoana azy miresakaEfa nanangona modely soso-kevitra ampolony roa izahay.

Mpantarana fanontaniana an-dalana

Ankehitriny, raha ampidirinao eo amin'ny drafitra nodinihina ilay fanontaniana tany am-boalohany, dia ho hitanao hoe ohatrinona ny fotoana lany tamin'ny fanambarana tsirairay - toy izao:

Ny atao hoe EXPLAIN dia mangina sy ny fomba ahazoana azy miresaka

...na toy izao aza:

Ny atao hoe EXPLAIN dia mangina sy ny fomba ahazoana azy miresaka

Fanoloana masontsivana ho fangatahana

Raha "nampifandraisina" tsy fangatahana amin'ny drafitra fotsiny ianao, fa koa ny masontsivana avy amin'ny tsipika DETAIL amin'ny log, azonao atao koa ny mandika izany amin'ny iray amin'ireo safidy:

  • miaraka amin'ny fanoloana sanda amin'ny fangatahana
    ho an'ny famonoana mivantana eo amin'ny fototrao sy ny mombamomba anao bebe kokoa

    SELECT 'const', 'param'::text;
  • miaraka amin'ny fanoloana sanda amin'ny alΓ lan'ny PREPARE/EXECUTE
    mba haka tahaka ny asan'ny mpandrindra, rehefa azo tsinontsinoavina ny ampahany parametrika - ohatra, rehefa miasa amin'ny latabatra mizarazara

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

Arsivan'ny drafitra

Apetaho, hamakafaka, zarao amin'ny mpiara-miasa! Ny drafitra dia hijanona ho voatahiry ary afaka miverina any amin'izy ireo ianao amin'ny manaraka: explain.tensor.ru/archive

Fa raha tsy tianao ho hitan'ny hafa ny drafitrao dia aza adino ny manamarina ny boaty "aza avoaka ao anaty arisiva".

Ao amin'ny lahatsoratra manaraka dia hiresaka momba ny fahasarotana sy ny fanapahan-kevitra mipoitra rehefa mamakafaka drafitra.

Source: www.habr.com

Add a comment