Cad é MÍNIÚ ciúin faoi agus conas é a chur ag caint

Is mar a chéile beagnach i gcónaí an cheist clasaiceach a thugann forbróir chuig a DBA nó úinéir gnó chuig comhairleoir PostgreSQL: “Cén fáth a thógann sé chomh fada iarratais a chomhlánú ar an mbunachar sonraí?”

Sraith cúiseanna traidisiúnta:

  • algartam neamhéifeachtach
    nuair a shocraíonn tú dul isteach i roinnt CTEanna thar chúpla na mílte taifead
  • staitisticí nach mbaineann le hábhar
    má tá dáileadh iarbhír na sonraí sa tábla an-difriúil cheana féin ón gceann a bhailigh ANAILYZE an uair dheireanach
  • "breiseán" ar acmhainní
    agus níl dóthain cumhachta tiomnaithe ríomhaireachta ag an LAP a thuilleadh, bíonn ghigibheart cuimhne á bpumpáil i gcónaí, nó ní féidir leis an diosca coinneáil suas le “mian” an bhunachair sonraí
  • ag blocáil ó phróisis iomaíocha

Agus má tá blocálacha deacair go leor a ghabháil agus a anailísiú, ansin le haghaidh gach rud eile a theastaíonn uainn plean ceiste, is féidir a fháil ag baint úsáide as MÍNIÚ oibreoir (Tá sé níos fearr, ar ndóigh, MÍNIÚ láithreach (ANAILÍS, BUFFERS) ...) nó modúl auto_explain.

Ach, mar a dúradh sa doiciméadú céanna,

“Is ealaín é plean a thuiscint, agus teastaíonn méid áirithe taithí chun é a mháistir...”

Ach is féidir leat a dhéanamh gan é má úsáideann tú an uirlis cheart!

Cén chuma a bhíonn ar phlean fiosrúcháin go hiondúil? Rud éigin mar sin:

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

nó mar seo:

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

Ach tá sé an-deacair agus doiléir an plean a léamh i dtéacs “ón mbileog”:

  • ar taispeáint sa nód suim ag acmhainní subtree
    is é sin, le tuiscint a fháil ar an méid ama a thóg sé nód áirithe a rith, nó cé mhéad go díreach a thug an léamh seo ón tábla sonraí ón diosca suas, ní mór duit ceann a dhealú ar bhealach éigin ón gceann eile
  • tá gá le ham nód iolrú faoi lúb
    Sea, ní dealú an oibríocht is casta a chaithfear a dhéanamh "sa cheann" - tar éis an tsaoil, léirítear an t-am forghníomhaithe mar an meán le haghaidh aon fhorghníomhú nód amháin, agus is féidir na céadta acu a bheith ann.
  • bhuel, agus cuireann sé seo go léir le chéile cosc ​​orainn an phríomhcheist a fhreagairt - mar sin cé hé "an nasc is laige"?

Nuair a rinneamar iarracht é seo go léir a mhíniú do na céadta dár bhforbróirí, thuig muid gur fhéach sé ar an taobh amuigh rud éigin mar seo:

Cad é MÍNIÚ ciúin faoi agus conas é a chur ag caint

Agus ciallaíonn sé sin go dteastaíonn uainn...

Uirlis

In sé rinneamar iarracht na príomhmheicnic go léir a bhailiú a chabhraíonn le tuiscint a fháil ar “cé atá an milleán agus cad atá le déanamh” de réir an phlean agus an iarratais. Bhuel, agus roinn cuid de do thaithí leis an bpobal.
Buail le chéile agus úsáid - mínigh.tensor.ru

Infheictheacht na bpleananna

An bhfuil sé éasca an plean a thuiscint nuair a bhreathnaíonn sé mar seo?

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

Ní i ndáiríre.

Ach mar seo, i bhfoirm ghiorraithenuair a bhíonn na príomhtháscairí deighilte, bíonn sé i bhfad níos soiléire:

Cad é MÍNIÚ ciúin faoi agus conas é a chur ag caint

Ach má bhíonn an plean níos casta, tiocfaidh sé chun tarrthála dáileadh ama pichart le nóid:

Cad é MÍNIÚ ciúin faoi agus conas é a chur ag caint

Bhuel, le haghaidh na roghanna is deacra tá sé i Hurry chun cabhrú leat chairt dul chun cinn:

Cad é MÍNIÚ ciúin faoi agus conas é a chur ag caint

Mar shampla, tá cásanna neamhfhánacha ann nuair a d’fhéadfadh níos mó ná fréamh amháin a bheith i bplean:

Cad é MÍNIÚ ciúin faoi agus conas é a chur ag caintCad é MÍNIÚ ciúin faoi agus conas é a chur ag caint

Leideanna struchtúracha

Bhuel, má tá struchtúr iomlán an phlean agus a chuid spotaí goirt leagtha amach cheana féin agus le feiceáil, cén fáth nach aibhsigh tú don fhorbróir iad agus mínigh iad i “Rúisis”?

Cad é MÍNIÚ ciúin faoi agus conas é a chur ag caintTá cúpla dosaen teimpléad molta den sórt sin bailithe againn cheana féin.

Próifíleoir fiosrúcháin líne-ar-líne

Anois, má fhorshuiteann tú an cheist bhunaidh ar an bplean anailísithe, is féidir leat a fheiceáil cé mhéad ama a caitheadh ​​ar gach ráiteas aonair - rud éigin mar seo:

Cad é MÍNIÚ ciúin faoi agus conas é a chur ag caint

...nó fiú mar seo:

Cad é MÍNIÚ ciúin faoi agus conas é a chur ag caint

Paraiméadair a chur in ionad iarratas

Má “cheangail tú” ní hamháin iarratas leis an bplean, ach freisin a pharaiméadair ó líne SONRAÍ an loga, is féidir leat é a chóipeáil freisin i gceann de na roghanna:

  • le hionadú luacha san iarratas
    le haghaidh forghníomhú díreach ar do bhonn agus próifíliú breise

    SELECT 'const', 'param'::text;
  • le hionadú luacha trí ULLMHÚ/FHEIDHMIÚ
    chun aithris a dhéanamh ar obair an sceidealóra, nuair is féidir neamhaird a dhéanamh den chuid pharaiméadrach - mar shampla, agus é ag obair ar tháblaí deighilte

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

Cartlann na bpleananna

Greamaigh, anailís a dhéanamh, a roinnt le comhghleacaithe! Fanfaidh na pleananna sa chartlann agus is féidir leat filleadh orthu níos déanaí: explain.tensor.ru/archive

Ach mura dteastaíonn uait go bhfeicfeadh daoine eile do phlean, ná déan dearmad an bosca “ná foilsigh sa chartlann” a sheiceáil.

Sna hailt seo a leanas labhróidh mé faoi na deacrachtaí agus na cinntí a thagann chun cinn agus mé ag déanamh anailís ar phlean.

Foinse: will.com

Add a comment