Kuboresha hoja katika ORACLE kwa kutumia mpango wa utekelezaji. Kuelewa Matokeo ya Tekeleza Mpango wa Kufafanua katika Msanidi Programu wa Oracle SQL

Acha nifafanue mara moja kwamba nitaelezea kwa kutumia mfano wa kutumia matumizi ya bure ya OraDeveloper Studio. Kwa nini? Kwa sababu haikuwezekana kufanya hivyo kwa maswali ya kawaida, na hakukuwa na wakati au hamu ya kuijua, kwani kuna njia rahisi zaidi. 😉

Kwa hivyo, hii ni ya nini hata? Nitakuelezea mfano maalum, kwa sababu ambayo nililazimishwa kufanya uboreshaji.

Kazi ni kupakia makumi ya maelfu ya safu za data kwenye hifadhidata. Kwa kila safu mlalo, lazima kwanza utafute data ya ziada kwenye hifadhidata iliyo na swali moja gumu (meza 4 kupitia viungio).
Shida ni kwamba kupakia safu elfu 15 huchukua masaa 8-9. Kwa kuwa, kwa mujibu wa masharti ya kazi, ni muhimu kupakia mara nyingi, na si mara moja kila baada ya miaka mitano ... Kwa ujumla, tunahitaji kuleta muda kwa kiwango cha kukubalika.

Nilichofanya?
1. Niligundua kuwa ni chaguo ambalo linapunguza kasi (data imeingizwa na kusasishwa kwenye jedwali ambapo kuna rundo la safu na baadhi ya jedwali hazina faharisi wala funguo - kwa hivyo mashaka juu ya kosa la waliochaguliwa) .
2. Imeangalia uwepo wa faharisi kwenye sehemu zinazotumiwa na ombi. Aliongeza kukosa.
3. Kuombwa msaada kwa wale waliojua. 🙂

Wale wanaofahamu walitushauri kuchanganua mpango wa utekelezaji wa hoja na wakaeleza jinsi ya kufanya hivyo katika OraDev.
Unda dirisha jipya la hoja (Ctrl+N). Tunakili ombi letu ndani yake. Bonyeza Alt+G. Chagua iliyopo au uunde meza mpya mpango.
Baada ya utekelezaji, mti wa mpango wa utekelezaji utaonekana. Si rahisi sana kuihesabu peke yako na bila nusu lita. 😉

Ni nini kinatuvutia kuhusu mti huu? Tunavutiwa na nodi (hatua) ambazo Gharama kubwa ya hatua imeonyeshwa. Unaweza kuona bei ya hatua katika mali ya hatua (nina dirisha la mali limefunguliwa kila wakati na kwa hivyo ninahitaji tu kuchagua hatua sahihi; unaweza pia kuhitaji kuchagua mali kwa kubofya kulia kwenye hatua). Tunatafuta hatua ya polepole (hatuzingatii nodi ya juu zaidi, mzizi wa mti wa mpango - bei ya jumla ya ombi itaonyeshwa hapo, na tayari tunajua kuwa shida iko katika ombi hili). Umeipata? Sasa tunaangalia ni meza gani, ambayo mashamba na safu ngapi hatua inafanya kazi - hii ni katika mali na jina la hatua. Tunaangalia na kufikiria, kwa nini ni polepole sana hapa?
Kwa mfano, moja ya hatua ilifanya kazi na rekodi 4000 badala ya rekodi moja au tatu (sio maelfu). Hii haikupaswa kutokea kimsingi - ninapunguza sampuli kwa usahihi ili kuchagua kutoka kwa safu inayohitajika, na sio kutoka kwa rundo la takataka isiyo ya lazima. Baada ya kuangalia kwa uangalifu hali ya kujiunga, niligundua kuwa nilikuwa nimekosa moja ya uwanja. Niliongeza uwanja kwa ombi na kila kitu kilifanyika. Bei ya ombi (kamili) ilipungua kutoka 531 hadi 6. :)

Shukrani kwa kiota cha wandugu na tambua kwa msaada wao.

P.S. Samahani kwa kutojumuisha picha za skrini. Ingekuwa wazi zaidi kwao, lakini ... Kwa sababu ya usiri wa habari fulani, 80% ingelazimika kufutwa na tena isingekuwa wazi.
P.P.S. Muda wa upakiaji kwa ujumla umepunguzwa sana. Ilichukua dakika 12 kupakia safu elfu 17.5 za data kwenye hifadhidata. Ikilinganishwa na masaa 8-9 ... Naam, tayari umeelewa kila kitu mwenyewe. 😉

5 majibu

ELEZA Pato la MPANGO ni utoaji wa utatuzi wa kiboreshaji Maswali ya Oracle. COST ni matokeo ya mwisho ya kiboreshaji gharama (CBO) ambacho lengo lake ni kuchagua ni mipango ipi kati ya mingi inayoweza kutumika kutekeleza hoja. CBO hukokotoa gharama inayolingana kwa kila mpango, kisha huchagua mpango wenye gharama ya chini zaidi.

(Kumbuka: Katika baadhi ya matukio CBO haina muda wa kutosha wa kutathmini mipango yote inayowezekana, katika hali hizi inachagua tu mpango wenye gharama ya chini zaidi iliyopatikana kufikia sasa)

Kwa ujumla, moja ya michango mikubwa kwa swali la polepole ni idadi ya safu zilizosomwa ili kuhudumia swali (kwa usahihi zaidi, vizuizi), kwa hivyo gharama itategemea sehemu ya idadi ya safu ambazo makadirio ya kiboreshaji yatahitaji kusomwa. .

Kwa mfano, tuseme una swali lifuatalo:

CHAGUA emp_id KUTOKA kwa wafanyakazi AMBAPO miezi_ya_huduma = 6;

(Safu ya_ya_huduma ya miezi_ya_huduma ina kikwazo NOT NULL juu yake na faharasa ya kawaida juu yake.)

Kuna mipango miwili kuu ambayo kiboreshaji kinaweza kuchagua kutoka hapa:

  • Panga 1: Soma safu mlalo zote kutoka kwa jedwali la "wafanyakazi", kwa kila hundi ikiwa kiima ni kweli (miezi_ya_huduma=6).
  • Mpango wa 2: Soma faharasa ambapo months_of_service=6 (hii husababisha seti ya ROWID), kisha ufikie jedwali kulingana na ROWID zilizorejeshwa.

Wacha tuchukue kuwa jedwali la "wafanyakazi" lina safu 1,000,000 (milioni 1). Hebu tufikirie zaidi kwamba thamani za miezi_ya_huduma huanzia 1 hadi 12 na kwa sababu fulani zinasambazwa sawasawa.

Bei Mpango 1, ambayo inajumuisha FULL SCAN, itagharimu kusoma safu zote kwenye jedwali la wafanyikazi, ambayo ni takriban 1,000,000; lakini kwa kuwa Oracle mara nyingi inaweza kusoma vizuizi kwa kutumia vizuizi vingi, gharama halisi itakuwa chini (kulingana na jinsi hifadhidata yako imeundwa) - kwa mfano, wacha tuseme idadi ya sampuli zilizo na vizuizi vingi ni 10 - makadirio ya gharama ya kamili. scan itakuwa 1,000,000/10; Jumla ya gharama = 100,000.

Bei Mpango 2, ambayo inajumuisha INDEX RANGE SCAN na kutafuta jedwali kwa ROWID, kutagharimu uchanganuzi wa faharasa pamoja na gharama ya kufikia jedwali kwa kutumia ROWID. Sitazingatia jinsi uchanganuzi wa faharasa wa masafa ungegharimu, lakini hebu tufikirie kwamba gharama ya uchanganuzi wa faharasa ya masafa ni 1 kwa kila safu; tunatarajia kupata mechi 1 kati ya mara 12, hivyo gharama ya kuscan index ni 1,000,000/12 = 83,333; pamoja na gharama ya ufikiaji wa jedwali (chukua kizuizi 1 kinachosomwa kwa kila ufikiaji, hatuwezi kutumia vizuizi vingi kusoma hapa) = 83.333; Jumla ya gharama = 166,666.

Kama unaweza kuona, gharama ya mpango 1 (scan kamili) ni chini ya gharama ya mpango 2 (angalia index + upatikanaji wa mstari) - hii ina maana kwamba CBO itachagua skanisho kamili.

Ikiwa mawazo yaliyotolewa hapa na kiboreshaji ni sawa, basi kwa kweli Mpango wa 1 utakuwa bora na mzuri zaidi kuliko Mpango wa 2 - ambao unakanusha hadithi kwamba skanning KAMILI ni "mbaya kila wakati".

Matokeo yangekuwa tofauti kabisa ikiwa lengo la kiboreshaji lilikuwa FIRST_ROWS(n) badala ya ALL_ROWS - kwa hali ambayo kiboreshaji kingependelea mpango wa 2 kwa sababu mara nyingi kingerudisha safu za kwanza haraka, kwa gharama ya kuwa na ufanisi mdogo kwa hoja nzima. .

CBO huunda mti wa uamuzi kwa kukadiria gharama za kila njia inayowezekana ya utekelezaji inayopatikana kwa kila ombi. Gharama huwekwa na kigezo cha CPU_cost au I/O_cost kilichowekwa kwenye mfano. Na CBO inakadiria gharama inavyoweza kwa takwimu zilizopo za majedwali na faharasa ambazo zitatumika katika hoja. Hupaswi kubinafsisha ombi lako kulingana na gharama pekee. Gharama hukuruhusu kuelewa KWA NINI kiboreshaji hufanya kile kinachofanya. Bila gharama, unaweza kuelewa kwa nini kiboreshaji kilichagua mpango ambao ilifanya. Zaidi gharama nafuu haimaanishi ombi la haraka. Kuna nyakati ambapo hii ni kweli na kutakuwa na wakati ambapo ni makosa. Gharama inategemea jedwali lako la takwimu na ikiwa si sahihi gharama itakuwa si sahihi.

Wakati wa kuanzisha swala, unapaswa kuangalia kardinali na idadi ya safu za kila hatua. Je, zina maana? Je, kiboreshaji kinazingatiwa kuwa sawa? Je, masharti yamerejeshwa kwa usahihi? Ikiwa habari haipo kwa usahihi, basi uwezekano mkubwa kwamba kiboreshaji hakina taarifa sahihi inayohitajika kufanya uamuzi sahihi. Hii inaweza kuwa kutokana na takwimu zilizopitwa na wakati au kukosa katika jedwali na faharasa, pamoja na takwimu za cpu. Ni vyema kusasisha takwimu wakati wa kusanidi hoja yako ili kupata manufaa zaidi kutoka kwa kiboreshaji. Kujua mzunguko wako pia husaidia sana na usanidi. Kujua wakati kiboreshaji kimechagua kweli uamuzi mbaya na akaielekeza njia sahihi kwa kidokezo kidogo, unaweza kuokoa muda.

Kutaja kwako "FULL" kunaniashiria kuwa swali linachanganua skrini nzima ili kupata data yako. Katika baadhi ya matukio hii ni sawa, vinginevyo ni kiashiria cha uandikishaji mbaya wa indexing / swala.

Kama kanuni ya jumla, unataka hoja yako itumie vitufe ili Oracle ipate data unayohitaji kwa kufikia idadi ndogo zaidi ya safu mlalo. Hatimaye, siku moja utaweza kufikia usanifu wa meza zako. Ikiwa gharama zitasalia juu sana, unaweza kuhitaji kufikiria jinsi ya kurekebisha muundo wako wa mzunguko kwa utendakazi bora.

Hivi karibuni Matoleo ya Oracle COST inawakilisha muda ambao kiboreshaji hungoja swali, ikionyeshwa katika vitengo vya muda inachukua kusoma block moja.

Kwa hivyo, ikiwa kusoma block moja kutachukua 2ms na gharama inaonyeshwa kama "250", ombi linaweza kuchukua 500ms kukamilika.

Kiboreshaji huhesabu gharama kulingana na makadirio ya idadi ya usomaji wa block moja na block nyingi, pamoja na matumizi ya CPU ya mpango. ya mwisho inaweza kuwa muhimu sana kwa kupunguza gharama kwa kufanya shughuli fulani kabla ya wengine kujaribu kuepuka gharama kubwa za CPU.

Hii inazua swali la jinsi kiboreshaji kinajua ni muda gani shughuli huchukua kukamilika. matoleo ya hivi karibuni Oracle inakuwezesha kuunda makusanyo ya "takwimu za mfumo", ambayo kwa hakika haipaswi kuchanganyikiwa na takwimu za meza au index. Takwimu za mfumo ni vipimo vya utendaji vifaa, muhimu zaidi:

  • Inachukua muda gani kusoma block moja.
  • Usomaji wa kazi nyingi huchukua muda gani?
  • Jedwali la multiblock ni kubwa kiasi gani (mara nyingi ni tofauti na kiwango cha juu kinachowezekana kutokana na ukubwa wa meza kuwa chini ya thamani ya juu na sababu nyingine).
  • Utendaji wa CPU

Nambari hizi zinaweza kutofautiana kwa kiasi kikubwa kulingana na mazingira ya uendeshaji wa mfumo, na takwimu tofauti zinaweza kuhifadhiwa kwa ajili ya shughuli za "OLTP mchana" na shughuli za "kuripoti mara kwa mara kila usiku", na kwa "ripoti za mwisho wa mwezi" ukipenda.

Kwa kuzingatia seti hizi za takwimu, mpango huu Utekelezaji wa hoja unaweza kukadiriwa kwa gharama katika mazingira tofauti ya uendeshaji, ambayo yanaweza kuhimiza matumizi ya uchanganuzi kamili wa jedwali katika baadhi ya matukio au uchanganuzi wa faharasa katika zingine.

Gharama si kamili, lakini kiboreshaji huboreka katika kujifuatilia kwa kila toleo na kinaweza kujibu gharama halisi dhidi ya makadirio ya gharama ya kukubalika. ufumbuzi bora katika siku zijazo. pia hufanya utabiri kuwa mgumu.

Tafadhali kumbuka kuwa gharama haihitajiki wakati wa ukuta, kwa kuwa shughuli za hoja sambamba hutumia jumla ya muda kwenye nyuzi nyingi.

Katika matoleo ya zamani ya Oracle, gharama ya uendeshaji wa CPU ilipuuzwa, na gharama ya jamaa ya usomaji wa block moja na nyingi ilirekebishwa kwa ufanisi kulingana na vigezo vya init.

Unaweza pia kuuliza v $sql na v $session ili kupata takwimu kuhusu taarifa za SQL, na hii itakuwa na vipimo vya kina vya kila aina ya rasilimali, muda na utekelezaji.

Ni kama msumari kwenye soli ya kiatu unachopenda. Unaweza kutembea, lakini mara nyingi zaidi na zaidi unajikuta unataka kukaa mahali au kukabidhi kazi kwa wengine. Usumbufu mdogo sio tu kupunguza kasi ya kazi yetu, lakini pia kupunguza motisha, kuingilia kati mchakato, na kupunguza ubora wa matokeo. Na ikiwa umepata rafiki ambaye alikufundisha kuchukua nyundo na nyundo msumari huo, hutamshukuru tu kwa msaada wake, lakini pia utawasaidia wengine mwenyewe, kuwaokoa kutoka kwa kizuizi kidogo lakini kinachokasirisha sana. Hii ndiyo sababu unahitaji kuwasiliana, kushiriki sio tu maarifa ya kina na ya ndani katika mabaraza na tovuti kama Habr, lakini pia hila zako rahisi na "mbinu ndogo"

Kama maandishi yoyote, maswali na programu katika SQL zinaweza kuundwa kwa yoyote mhariri wa maandishi. Lakini ikiwa wewe ni mtaalamu, unafanya kazi nyingi na mara nyingi na SQL, basi kuwa na uangaziaji wa sintaksia na uundaji upya wa msimbo otomatiki hautakutosha tena, haswa ikiwa itabidi ubadilishe kati ya matoleo tofauti ya DBMS sawa au. majukwaa tofauti DBMS.

Hivi majuzi nilitokea kuwasiliana na mmoja wa wataalamu wakuu Oracle DBMS. Aliambia mambo mengi ya kupendeza juu ya kufanya kazi na mipango ya utekelezaji wa hoja ndani matoleo tofauti DBMS hii na hakusita kumwambia kila mtu kuhusu zana na mbinu anazotumia na kutoa vidokezo vidogo muhimu. Nilitafsiri moja ya nakala kwenye blogi yake na ningependa kuifahamisha Khabravchan. Licha ya ukweli kwamba mbinu iliyoelezewa ilitumiwa kufanya kazi na Oracle, sasa ninatumia njia sawa kwa MS SQL na Sybase.

Tekeleza swali la utekelezaji na kichupo cha Mpango wa Hoji kitaonekana, kikijazwa na mpango wa utekelezaji.


Weka mshale wa panya kwenye nodes yoyote kwenye mchoro na ziada habari muhimu, inayohusiana na hatua hii ya utekelezaji kutoka kwa mpango wa hoja!
Kwa chaguo-msingi, Rapid SQL inaonyesha mpango wa utekelezaji kwa michoro. Nilitoka katika ulimwengu wa zamani wa uboreshaji…. Ninapendelea toleo la maandishi, kwa hivyo ninabofya kitufe cha kulia panya kwenye dirisha na mpango na uchague "Angalia kama maandishi".
Ninapendelea kuona maandishi ya ombi na mpango kwa wakati mmoja.


Ni rahisi kufanya. Je, unaona tabo za dirisha la ISQL chini ya dirisha kuu? Kwanza, tunahitaji kusanidi Rapid SQL ili iweze kuonyesha mpango katika dirisha tofauti.


Bofya kitufe cha Chaguzi (mduara nyekundu wa kushoto) na kisha uweke chaguo la 'Halijaambatishwa' kwa dirisha la Matokeo. Hii itaunda tabo mbili tofauti chini ya Rapid SQL mara tu hoja itakapotekelezwa. Buruta tu dirisha hili kidogo na kichupo na mstatili utaonekana ambapo unaweza kuhamisha dirisha hili.
Au unaweza kutumia kipengee cha Tile windows kutoka kwa menyu kuu ya programu

Na jambo moja zaidi: hii yote pia inafanya kazi katika DBArtisan - suluhisho kwa wasimamizi wa hifadhidata.

Ni kama msumari kwenye soli ya kiatu unachopenda. Unaweza kutembea, lakini mara nyingi zaidi na zaidi unajikuta unataka kukaa mahali au kukabidhi kazi kwa wengine. Usumbufu mdogo sio tu kupunguza kasi ya kazi yetu, lakini pia kupunguza motisha, kuingilia kati mchakato, na kupunguza ubora wa matokeo. Na ikiwa umepata rafiki ambaye alikufundisha kuchukua nyundo na nyundo msumari huo, hutamshukuru tu kwa msaada wake, lakini pia utawasaidia wengine mwenyewe, kuwaokoa kutoka kwa kizuizi kidogo lakini kinachokasirisha sana. Hii ndiyo sababu unahitaji kuwasiliana, kushiriki sio tu maarifa ya kina na ya ndani katika mabaraza na tovuti kama Habr, lakini pia hila zako rahisi na "mbinu ndogo"

Kama maandishi yoyote, maswali na programu katika SQL zinaweza kuundwa katika kihariri chochote cha maandishi. Lakini ikiwa wewe ni mtaalamu, unafanya kazi sana na mara nyingi ukitumia SQL, basi kuwa na uangaziaji wa sintaksia na uundaji upya wa msimbo otomatiki hautatosha kwako tena, haswa ikiwa itabidi ubadilishe kati ya matoleo tofauti ya DBMS sawa au majukwaa tofauti ya DBMS.

Hivi majuzi niliwasiliana na mmoja wa wataalamu wakuu wa Oracle DBMS. Aliambia mambo mengi ya kuvutia kuhusu kufanya kazi na mipango ya utekelezaji wa hoja katika matoleo mbalimbali ya DBMS hii na hakusita kuwaambia kila mtu kuhusu zana na mbinu anazotumia na kutoa vidokezo vidogo muhimu. Nilitafsiri moja ya nakala kwenye blogi yake na ningependa kuifahamisha Khabravchan. Licha ya ukweli kwamba mbinu iliyoelezewa ilitumiwa kufanya kazi na Oracle, sasa ninatumia njia sawa kwa MS SQL na Sybase.

Tekeleza swali la utekelezaji na kichupo cha Mpango wa Hoji kitaonekana, kikijazwa na mpango wa utekelezaji.


Weka kipanya chako juu ya nodi zozote kwenye mchoro na maelezo ya ziada muhimu yanayohusiana na hatua hiyo ya utekelezaji kutoka kwa mpango wa hoja itaonekana!
Kwa chaguo-msingi, Rapid SQL inaonyesha mpango wa utekelezaji kwa michoro. Nilitoka katika ulimwengu wa zamani wa uboreshaji…. Ninapendelea toleo la maandishi, kwa hivyo ninabofya kulia kwenye dirisha la mpango na uchague "Angalia kama Maandishi".
Ninapendelea kuona maandishi ya ombi na mpango kwa wakati mmoja.


Ni rahisi kufanya. Je, unaona tabo za dirisha la ISQL chini ya dirisha kuu? Kwanza, tunahitaji kusanidi Rapid SQL ili iweze kuonyesha mpango katika dirisha tofauti.


Bofya kitufe cha Chaguzi (mduara nyekundu wa kushoto) na kisha uweke chaguo la 'Halijaambatishwa' kwa dirisha la Matokeo. Hii itaunda tabo mbili tofauti chini ya Rapid SQL mara tu hoja itakapotekelezwa. Buruta tu dirisha hili kidogo na kichupo na mstatili utaonekana ambapo unaweza kuhamisha dirisha hili.
Au unaweza kutumia kipengee cha Tile windows kutoka kwa menyu kuu ya programu

Na jambo moja zaidi: hii yote pia inafanya kazi katika DBArtisan - suluhisho kwa wasimamizi wa hifadhidata.

Hifadhidata ya Oracle 11g Urekebishaji wa Utendaji.

Jinsi ya kusoma mipango ya maswali

Mpango wa utekelezaji ni nini?

Mpango wa utekelezaji ni matokeo ya kiboreshaji kilichotafsiriwa katika lugha ya injini ya utekelezaji. Inaelekeza injini ya utekelezaji kuhusu shughuli zinazopaswa kufanywa ili kupata data iliyoombwa na usemi haraka na kwa ufanisi iwezekanavyo.

Usemi wa EXPLAIN PLAN hunasa mpango wa utekelezaji uliochaguliwa na kiboreshaji kwa ajili ya kutekeleza matamshi kama vile CHAGUA, SASISHA, FUTA, na WEKA. Hatua za mpango wa utekelezaji hazitekelezwi kwa mpangilio zilivyoainishwa kwenye mpango. Kuna uhusiano wa mzazi na mtoto kati ya hatua. mti wa kamba chanzo ndio msingi wa mpango wa utekelezaji. Ina taarifa zifuatazo:

  • Kupanga majedwali yaliyorejelewa na taarifa
  • Njia ya ufikiaji kwa kila jedwali iliyoainishwa kwenye taarifa
  • Jiunge na njia ya jedwali, inayotumiwa na waendeshaji jiunge katika usemi
  • Uendeshaji wa data kama vile kichujio, kupanga au kujumlisha
Kwa kuongeza mti wa kamba ya chanzo (au mti wa mtiririko wa data ndani shughuli sambamba) jedwali la mpango lina data ifuatayo:
  • Data ya uboreshaji kama vile gharama na umuhimu wa kila operesheni
  • Data ya sehemu, kama vile seti ya sehemu zinazofikiwa
  • Data ya kubadilishana fedha kama vile mbinu ya usambazaji wa operesheni ya kujiunga
Matokeo ya EXPLAIN PLAN yanaweza kukusaidia kubaini ikiwa kiboreshaji kinachagua mpango mahususi wa utekelezaji, kama vile kutumia vitanzi vilivyowekwa.


Ninaweza kupata wapi mipango ya utekelezaji?

Kuna njia nyingi za kupata mipango ya utekelezaji ya misemo kwenye hifadhidata, maarufu zaidi zimeorodheshwa hapa chini:

  • Amri ya EXPLAIN PLAN hukuruhusu kutazama mpango wa utekelezaji ambao kiboreshaji kinaweza kutumia kutekeleza usemi. Amri hii ni muhimu sana kwa sababu huunda mpango wa utekelezaji na kuuandika kwenye jedwali linaloitwa PLAN_TABLE bila kuhifadhi taarifa ya SQL.
  • V$SQL_PLAN hutoa uwezo wa kuona mipango ya utekelezaji ya vielekezi ambavyo vimetekelezwa hivi majuzi. Taarifa zilizohifadhiwa katika V$SQL_LAN ni sawa na taarifa zinazotolewa na amri ya EXPLAIN PLAN. Hata hivyo, Mpango wa Eleza unaonyesha mpango unaowezekana wa utekelezaji, na V$SQL_PLAN huhifadhi mipango ya hoja zilizotekelezwa.
  • V$SQL_PLAN_MONITOR ina takwimu za ufuatiliaji wa kiwango cha mpango kwa kila taarifa ya SQL inayopatikana katika V$SQL_MONITOR. Kila mstari ulio katika V$SQL_PLAN_MONITOR unalingana na utendakazi mahususi wa mpango wa utekelezaji.
  • Mfumo wa AWR na mipango ya utekelezaji ya duka la Statspack ya SQL inayoitwa mara kwa mara. Mipango imewekwa katika mwonekano wa dBA_HIST_SQL_PLAN au STATS$SQL_PLAN.
  • Mipango ya utekelezaji na vyanzo vya safu mlalo pia huandikwa ili kufuatilia faili zinazozalishwa na DBMS_MONITOR.
  • Msingi wa Usimamizi wa SQL ni sehemu ya kamusi ya data iliyohifadhiwa katika nafasi ya meza ya SYSAUX. Maelezo ya kumbukumbu kuhusu utendakazi, historia ya mipango ya utekelezaji na mistari ya marejeleo huhifadhiwa hapa pamoja na wasifu kwa taarifa za SQL.
  • Tukio la uchunguzi 10053, linalotumiwa kurekodi mahesabu ya viboreshaji gharama, pia linaweza kutoa mipango ya utekelezaji wa hoja.
  • Kuanzia na toleo la 10.2, unapotupa hali ya mchakato, mpango wa utekelezaji pia umejumuishwa kwenye faili ya ufuatiliaji inayozalishwa.

Kuangalia mipango ya utekelezaji

Ukiendesha amri ya EXPLAIN PLAN katika SQL*Plus, unaweza kuchagua data kutoka kwa jedwali la PLAN_TABLE na kutazama mipango ya utekelezaji iliyozalishwa. Wengi kwa njia rahisi kuona mpango wa utekelezaji ni kutumia DBMS_XPLAIN kifurushi. Kifurushi cha DBMS_XPLAIN kina vitendaji vitano vinavyopatikana:

  • DISPLAY: Inatumika kwa matokeo yaliyoumbizwa ya mpango wa utekelezaji.
  • DISPLAY_AWR: Inatumika kwa utoaji wa mpango ulioumbizwa Utekelezaji wa SQL misemo iliyohifadhiwa kwenye hazina ya AWR.
  • DISPLAY_CURSOR: Inatumika kuumbiza matokeo ya mpango wa utekelezaji kutoka kwa kishale chochote kilichopakiwa
  • DISPLAY_SQL_PLAN_BASELINE: Inatumika kwa matokeo yaliyoumbizwa ya mpango mmoja au zaidi wa utekelezaji wa taarifa za SQL zinazotambuliwa na vichwa.
  • DISPLAY_SQLSET: Inatumika kwa utoaji ulioumbizwa wa mpango wa utekelezaji uliohifadhiwa katika seti ya SQL Tuning.
Faida ya kutumia kifurushi cha DBMS_XPLAIN ni kwamba hukuruhusu kutazama mpango wa utekelezaji ulioumbizwa wa taarifa ya SQL, bila kujali chanzo.

ELEZA MPANGO amri

  • Amri ya EXPLAIN PLAN hutumiwa kutengeneza mpango wa utekelezaji wa hoja.
  • Baada ya mpango kutengenezwa, unaweza kutazamwa kwa kuuliza habari kutoka kwa jedwali la PLAN_TABLE

PLAN TABLE huundwa kiotomatiki kama jedwali la muda la kimataifa, ambalo linatumiwa na watumiaji wote kuhifadhi mipango ya utekelezaji. Unaweza kuunda PLAN TABLE yako mwenyewe kwa kutumia hati $ORACLE_HOME/rdbms/admin/utlxplan.sql ikiwa hifadhi ya muda mrefu ya mipango ya utekelezaji inahitajika.


ELEZA MPANGO Muundo wa Amri


Amri ya MPANGO WA MAELEZO huingiza safu mlalo kwenye TABLE YA PLAN kwa kila hatua ya mpango wa utekelezaji.

ELEZA mfano wa amri ya MPANGO

Amri hii huingiza mpango wa utekelezaji wa usemi kwenye PLAN TABLE na kuongeza lebo ya demo01 kwa marejeleo ya baadaye.

Kuna njia nyingi za kupata mpango wa utekelezaji. Njia iliyo hapo juu ni kutumia amri ya EXPLAIN PLAN. Amri hii hutoa mpango wa utekelezaji wa taarifa ya SQL bila kuitekeleza, na huweka matokeo kwenye PLAN TABLE. PLAN TABLE inawakilisha muundo wa mti ambao unaweza kurudisha mpango wa utekelezaji wa usemi ukitumia kitambulisho na safu wima PARENT_ID na kifungu cha CONNECT BY katika CHAGUA usemi.

Kutoa yaliyomo kwenye PLAN TABLE


Mfano hapo juu unatumia kitufe YOTE kwa DBMS_XPLAIN.DISPLAY kitendakazi, ambacho hukuruhusu kutazama zote. taarifa zinazopatikana kuhusu mpango wa utekelezaji, uliohifadhiwa kwenye PLAN TABLE. Hitimisho hili pamoja na taarifa ya kawaida, ina Taarifa za ziada kama vile PROJECTION, ALIAS na taarifa ya REMOTE SQL ikiwa operesheni itasambazwa.

Kwa udhibiti sahihi zaidi wa habari ya pato, zifuatazo zinaweza kutumika: vigezo muhimu. Kila moja neno kuu inaongeza kizuizi tofauti kwa matokeo ya habari kutoka kwa PLAN TABLE. Maneno muhimu lazima yatenganishwe kwa koma au nafasi:

  • ROWS, ikiwa inafaa, inaonyesha idadi ya safu mlalo zinazotarajiwa kuhesabiwa na kiboreshaji.
  • ROWS, ikiwa inafaa, inaonyesha idadi ya baiti zinazotarajiwa kuhesabiwa na kiboreshaji.
  • GHARAMA ikiwa inafaa, inaonyesha gharama,labda imehesabiwa na kiboreshaji
  • SEHEMU ikiwa inafaa, inaonyesha mchungaji akitupa kwa kiboreshaji
  • PARALLEL au inafaa, inaonyesha habari ya PX (njiausambazaji wa habari na habari kuhusu foleni za upatikanaji wa jedwali)
  • TABIRIau inafaa, inaonyesha habari kuhusu kiima
  • PROJECTION au inafaa, inaonyesha sehemumakadirio

Kutumia Mpango wa Eleza katika Msanidi wa SQL

AUTOTRACE

Wakati usemikutekelezwa katika SQL*Plus au SQL Developer, unaweza kupata kiotomatiki mpango wa utekelezaji na takwimu za utekelezaji wa usemi. Ripoti huzalishwa kiotomatiki baada ya kufanya aina yoyote ya shughuli kama vile CHAGUA, INGIZA, SASISHA na UFUTE. Taarifa hii inaweza kutumika kutambua na kurekebisha utendaji wa taarifa za SQL.

Ili kutumia AUTOTRACE, ni lazima PLAN TABLE iundwe katika hifadhidata na mtumiaji anayetekeleza AUTOTRACE lazima apewe jukumu la PLUSTRACE. JukumuPLUSTRACE imeundwa na kutolewa kwa jukumu la DBA kwa kutumia hati$ORACLE_HOME/sqlplus/admin/plustrce.sql


Sintaksia AUTOTRACE

Unaweza kutekeleza Autotrace kwa kutumia syntax iliyoonyeshwa kwenye takwimu hapo juu. Chaguzi zifuatazo pia zinapatikana kwa matumizi:

  • IMEZIMWA Huzima matumizi ya ufuatiliaji
  • WASHA Huwasha utumiaji wa uelekezaji kiotomatiki
  • TRACE Huwasha ufuatiliaji otomatiki na kukandamiza matokeo ya SQL
  • ELEZA Inaonyesha mpango wa utekelezaji lakini haionyeshi takwimu
  • TAKWIMU Huonyesha takwimu bila mpango wa utekelezaji

Mifano ya kutumia AUTOTRACE




AUTOTRACE: TAKWIMU


Takwimu zilizorekodiwa na seva wakati wa kutekeleza usemi huonyesha sauti rasilimali za mfumo, iliyotumika katika kutekeleza usemi huo na inajumuisha viashirio vikuu vifuatavyo:

  • simu za kujirudia- wingi simu za kujirudia, inayotolewa kwa upande wa mteja na seva. Hifadhidata ya Oracle inasaidia meza zinazotumika kwa usindikaji wa ndani. Wakati Hifadhidata ya Oracle inahitaji kufanya mabadiliko kwenye jedwali hizi, hutoa mwendeshaji wa ndani SQL, ambayo kwa upande wake hutoa simu ya kujirudia.
  • db block inapata- idadi ya mara kizuizi cha CURRENT kinaombwa
  • thabiti anapata- idadi ya nyakati za uendeshaji wa usomaji muhimu wa vitalu vya data unaombwa.
  • kusoma kimwili- idadi ya vitalu vya data vilivyosomwa kutoka kwa diski. Nambari hii inawakilisha jumla ya maadili kimwili inasoma moja kwa moja na yote inasoma kutoka kwa bafa akiba.
  • fanya upya ukubwa- jumla ya idadi ya kufanywa upya katika vitalu
  • kaiti zilizotumwa kupitia SQL*Net kwa mteja- jumla ya idadi ya baiti zilizohamishwa kwa mteja kutoka kwa mchakato wa usuli.
  • baiti zilizopokelewa kupitia SQL*Net kutoka kwa mteja- jumla ya idadi ya baiti zilizopokelewa kutoka kwa mteja wa Oracle*Net
  • SQL*Safari za kurudi na kurudi hadi/kutoka kwa mteja- Idadi ya jumla ya ujumbe wa Oracle NET uliotumwa na kupokea kutoka kwa mteja.
  • aina (kumbukumbu)- idadi ya shughuli za upangaji ambazo zilikamilishwa kwa mafanikio kwenye kumbukumbu na haukuhitaji kuandika kwa diski.
  • panga (diski)- idadi ya shughuli za upangaji ambazo zilihitaji angalau operesheni moja ya diski.
  • safu mlalo imechakatwa- idadi ya safu zilizosindika wakati wa operesheni.

db_block_inapata inaonyesha shughuli za kusoma za kizuizi cha sasa kutoka kwa hifadhidata. thabiti anapata- hizi ni shughuli za usomaji wa kuzuia ambazo lazima zikidhi nambari maalum ya SCN. kusoma kimwili inaonyesha vizuizi vya kusoma kutoka kwa diski. db_block_inapata Na thabiti anapata- viashiria vya takwimu vinavyofuatiliwa daima. Zinapaswa kuwa chini ikilinganishwa na idadi ya safu zilizorejeshwa. Upangaji unafanywa kwa kumbukumbu, sio kwenye diski.

AUTO TRACE kwa kutumia SQL*Developer


Tazama V$SQL_PLAN

Mwonekano huu unaonyesha mipango ya utekelezaji ya vielekezi ambavyo bado viko kwenye akiba ya maktaba. Taarifa iliyohifadhiwa katika mtazamo huu kwa njia nyingi inafanana na taarifa kutoka kwa PLAN TABLE. Walakini, V$SQL_PLAN ina mipango ya utekelezaji ya misemo ambayo tayari imetekelezwa. Mpango wa utekelezaji unaozalishwa na EXPLAIN PLAN unaweza kutofautiana na mpango halisi wa utekelezaji uliohifadhiwa kwenye kielekezi. Hii hutokea kwa sababu vigezo vya kikao na BIND thamani tofauti zinaweza kutofautiana na za sasa.

Mtazamo mwingine muhimu: V$SQL_PLAN_STATISTICS ambayo hutoa takwimu za utekelezaji kwa kila operesheni katika mpango wa utekelezaji wa kila kielekezi kilichohifadhiwa. Wazo lingine muhimu V$SQL_PLAN_STATISTIC_ALL inachanganya taarifa za utekelezaji kutoka V$SQL_PLAN_STATISTICS Na V$SQL_WORKAREA na mpango wa utekelezaji uliohifadhiwa V$SQL_PLAN.


Maelezo ya safu wima kuu za mwonekano wa V$SQL_PLAN


Mwonekano una safu wima sawa na PLAN TABLE na safu wima chache za ziada. Safu wima zilizopo katika PLAN TABLE na zenye maadili sawa:

  • ANWANI
  • HASH_VALUE

PLAN_HASH_VALUE ni safu wima iliyo na uwakilishi wa nambari wa mpango wa usemi wa SQL wa kiteuzi. Kwa kulinganisha maadili ya safu wima ya PLAN_HASH_VALUE, unaweza kuamua haraka kama mpango wa utekelezaji wa usemi sawa unabadilika bila kuzilinganisha safu kwa safu.

Tazama V$SQL_PLAN_STATISTICS

Mwonekano wa V$SQL_PLAN_STATISTICS unatoa takwimu za sasa kwa utekelezaji kwa kila operesheni katika mpango wa utekelezaji, kama vile idadi ya safu zilizochakatwa au wakati wa utekelezaji. Takwimu zote, isipokuwa kwa idadi ya safu, zimekusanywa. Kwa mfano, takwimu za kujiunga kwenye jedwali zinaweza kujumuisha shughuli 3 za kujiunga na jedwali. Takwimu zilizohifadhiwa katika V$SQL_PLAN_STATISTICS zinapatikana kwa vielekezi ambavyo vilikusanywa kwa kigezo cha uanzishaji STATISTICS_LEVEL = ALL au kwa kutumia kidokezo cha viboreshaji cha GATHER_PLAN_STATISTICS.

Mwonekano wa V$SQL_STATISTICS_ALL una takwimu za matumizi ya kumbukumbu kwa safu mlalo zote chanzo zilizotumia kumbukumbu ya SQL (panga au HASH jiunge). Mwonekano huu unachanganya maelezo yaliyohifadhiwa katika mwonekano wa V$SQL_PLAN na takwimu za utekelezaji kutoka kwa V$SQL_PLAN_STATISTICS na V$SQL_WORKAREA. .

Uhusiano kati ya mitazamo muhimu ya utendaji inayobadilika



V$SQLAREA inaonyesha takwimu za maeneo ya SQL yaliyoshirikiwa na ina mstari mmoja kwa kila moja Mifuatano ya SQL maneno. Mtazamo huu unatoa takwimu za taarifa za SQL ambazo tayari zimechanganuliwa, katika kumbukumbu, na ziko tayari kutekelezwa:

  • SQL_ID- Kitambulisho cha SQL cha mshale mzazi kwenye kashe ya maktaba
  • VERSION_COUNT idadi ya vielekezi vya watoto ambavyo vipo kwenye akiba ya kishale fulani cha mzazi

V$SQL huhifadhi takwimu kwenye maeneo ya SQL iliyoshirikiwa na ina safu mlalo moja kwa kila msemo wa SQL wa ukoo unaotokana na usemi mzazi wa SQL:

  • ANWANI inawakilisha anwani ya kichwa cha mshale kwa mshale fulani
  • HASH_VALUE-thamani ya usemi wa mzazi kwenye kashe ya maktaba
  • SQL_ID- Kitambulisho cha SQL cha mshale mzazi kwenye kashe ya maktaba
  • PLAN_HASH_VALUE- nambari Mtazamo wa SQL panga kwa mshale huu
  • CHILD_NUMBER- nambari ya mshale wa mtoto

Takwimu zilizohifadhiwa katika V$SQL husasishwa kadri taarifa za SQL zinavyotekelezwa. Hata hivyo, kwa maneno ya muda mrefu, habari katika mtazamo inasasishwa kila sekunde tano. Hii inafanya uwezekano wa kutathmini athari ya utendaji wa hoja za muda mrefu wakati zinaendeshwa.

V$SQL_PLAN ina maelezo ya mpango wa utekelezaji kwa kila kielekezi cha mtoto kilichopakiwa kwenye akiba ya maktaba. Safu ANWANI, HASH_VALUE Na CHILD_NUMBER inaweza kutumika kuunganishwa na V$SQL kwa ufafanuzi wa baadaye wa mshale wa watoto.


V$SQL_PLAN_TAKWIMU hutoa takwimu za utekelezaji wa kiwango cha safu mlalo kwa kila kielekezi cha mtoto.Safu ANWANI, HASH_VALUE inaweza kutumika kwa kuchanganya na mtazamo V$SQLAREA kuamua mzazimshale. Safu ANWANI, HASH_VALUE Na CHILD_NUMBERinaweza kutumika kuunganishwa naV$SQLkufafanua vishale vya watoto.

V$SQL_PLAN_TAKWIMU_ZOTE ina takwimu za matumizi ya kumbukumbu kwa safu mlalo zote chanzo zilizotumia kumbukumbu ya SQL (panga au HASH jiunge) Mwonekano huu unajumlisha taarifa iliyohifadhiwa kwenye mwonekano. V$SQL_PLAN na takwimu za utekelezaji kutoka kwa maoni V$SQL_PLAN_STATISTICS Na V$SQL_WORKAREA.

V$SQL_WORKAREAhutoa takwimu za maeneo ya kazi yanayohusika katika mchakato SQL kazi maneno. Kila taarifa ya SQL iliyohifadhiwa katika bwawa la pamoja ina kishale moja au zaidi za mtoto, maelezo ambayo huhifadhiwa ndani V$SQL. V$SQL_WORKAREA ina maelezo kuhusu nafasi zote za kazi zinazohitajika na vishale hivi vya watoto.

V$SQL_WORKAREAinaweza kuunganishwa na V$SQLAREA (ANWANI, HASH_VALUE) na V$SQL ( ADDRESS, HASH_VALUE,CHILD_NUMBER).

Kwa kutumia uwakilishi huu, unaweza kupata majibu ya maswali yafuatayo:

  • Sehemu 10 bora za kazi zinazohitaji zaidiwingikumbukumbu kwa kashe
  • Kwa nafasi za kazi zinazoendeshwa katika hali ya AUTO, ni asilimia ngapi ya nafasi za kazi zinaendeshwa kwa kutumia kiwango cha juu kumbukumbu?

V$SQLSTATS huonyesha takwimu za msingi za utendakazi kwa vielekezi vya SQL, huku kila safu mlalo ikiwakilisha data inayochanganya maandishi ya usemi wa SQL na mpango wa utekelezaji wa SQL (mchanganyiko SQL_ID Na PLAN_HASH_VALUE) Safu wima ndani V$SQLSTATS kufanana, V$SQL Na V$SQLAREA. Hata hivyo, uwasilishaji V$SQLSTATS inatofautiana na V$SQL Na V$SQLAREA kasi ya usindikaji, scalability, muda mrefu wa kuhifadhi data (data ya takwimu inaweza kuhifadhiwa katika mtazamo, hata baada ya mshale kufukuzwa kutoka kwa bwawa la pamoja).

Mfano wa kuuliza data kutoka kwa mwonekano wa V$SQL_PLAN


Unaweza kuuliza data kutoka kwa mtazamo V$SQL_PLAN kutumia kipengele DBMS_XPLAIN.DISPLAY_CURSOR() kuonyesha usemi wa sasa au wa mwisho uliotekelezwa (kama inavyoonyeshwa kwenye mfano). Unaweza kupitisha thamani SQL_ID kama kigezo cha kupata mpango wa utekelezaji kujieleza. SQL_ID - SQL_ID misemo iliyohifadhiwa kwenye kashe ya mshale. Unaweza kupata thamani inayolingana kwa kuuliza habari ya safu wima SQL_ID V V$SQL Na V$SQLAREA. Vinginevyo, unaweza kuchagua PREV_SQL_ID kwa kikao maalum kutoka V$SESSION. Kwa chaguo-msingi, chaguo hili halijainishwa, katika hali ambayo mpango uliohifadhiwa kwenye mshale uliotekelezwa mwisho unaonyeshwa.

  • IOSTATS: Kwa kuchukulia kuwa utekelezaji wa SQL unakusanya takwimu za msingi za mipango ya utekelezaji, STATISTICS_LEVEL imewekwa kuwa ALL, au HINT GATHER_PLAN_STATISTICS inatumika), umbizo hili linaonyesha takwimu za I/O kwa wote, ikiwa ZOTE, zimebainishwa (au ya mwisho pekee, ikiwa LAST imebainishwa) utekelezaji wa mshale.
  • MESTATS: Ikizingatiwa kutumika udhibiti wa moja kwa moja PGA (pga_aggregate_target parameta imewekwa kwa thamani isiyo ya sifuri) umbizo hili hukuruhusu kuonyesha takwimu za matumizi ya kumbukumbu. aina hii takwimu zinatumika tu kwa utendakazi unaohitaji kumbukumbu, kama vile Kujiunga na HASH, kupanga, au baadhi ya waendeshaji bitmap.
  • ALLSTATS: Kisawe cha "IOSTATS MEMSTATS"
  • MWISHO: Kwa chaguomsingi, takwimu za mpango wa utekelezaji huonyeshwa kwa utekelezaji wote wa kishale. Kwa kutumia neno kuu la LAST, unaweza kuona takwimu za mpango zilizotolewa tangu mara ya mwisho ulipotekelezwa.

Maoni Muhimu ya AWR

Unaweza kutazama data ya AWR katika Kidhibiti cha Biashara au kwa kutoa ripoti ya AWR, na pia unaweza kufikia mitazamo ifuatayo ya utendakazi inayohifadhi data ya AWR:

  • V$ACTIVE_SESSION_HISTORY- mtazamo huu unaonyesha habari kuhusu shughuli za hivi karibuni za kikao, zinazosasishwa kila sekunde.
  • Mionekano ya kipimo cha V$ inawasilisha data ya kipimo ili kufuatilia utendaji wa mfumo. Orodha ya mionekano ya vipimo inaweza kutazamwa kwa kufikia mwonekano wa V$METRICGROUP.
  • Mionekano ya DBA_HIST ina data ya kihistoria iliyohifadhiwa katika hifadhidata. Kundi hili la maoni ni pamoja na:
  1. DBA_HIST_ACTIVE_SESS_HISTORY ina maudhui ya historia ya kipindi amilifu iliyochaguliwa kutoka kwenye kumbukumbu kulingana na shughuli za hivi majuzi za mfumo
  2. DBA_HIST_BASELINE ina habari kuhusu mistari ya kumbukumbu iliyohifadhiwa kwenye hifadhidata.
  3. DBA_HIST_DATABASE_INSTANCE ina habari kuhusu mazingira ya hifadhidata
  4. DBA_HIST_SNAPSHOT ina habari kuhusu vijipicha vilivyohifadhiwa kwenye mfumo
  5. DBA_HIST_SQL_PLAN ina habari kuhusu mipango ya utekelezaji
  6. DBA_HIST_WR_CONTROL ina maelezo kuhusu mipangilio ya AWR
Inaomba data kutoka kwa AWR


Inazalisha ripoti kwa maalumSQLkutoka kwa hazina ya AWR


Ufuatiliaji wa SQL


Zana Ufuatiliaji wa SQL inapatikana kwa chaguo-msingi wakati chaguo STATISTICS_LEVEL kuweka thamani KAWAIDA au YOTE. Kwa matumizi wa chombo hiki lazima pia kuweka thamani ya parameter CONTROL_MANAGEMENT_PACK_ACCESS kwa maana DIAGNOSTIC+TUNING kuwezesha kifurushi cha uchunguzi na usanidi.

Kwa chaguomsingi, ufuatiliaji wa SQL huwashwa kiotomatiki taarifa ya SQL inapotekelezwa sambamba au inapotumia zaidi ya sekunde tano za muda wa CPU au I/O wakati wa utekelezaji mmoja.

Kuna vidokezo viwili vya kuongeza kuwezesha au kuzima ufuatiliaji wa SQL kwa usemi - FUATILIA Na NO_MONITOR.

Unaweza kufuatilia takwimu za utekelezaji wa taarifa ya SQL kwa kutumia mionekano V$SQL_MONITOR Na V$SQL_PLAN_MONITOR.

Baada ya kuwezesha Ufuatiliaji wa Taarifa ya SQL katika Mwonekano wa Utendaji Unaobadilika V$SQL_MONITOR Huongeza maelezo yanayohitajika ili kufuatilia vipimo muhimu vya utendakazi kama vile muda wa utekelezaji, muda wa CPU, idadi ya kusoma na kuandika, muda wa I/O na vipimo vingine vya kusubiri. Hii takwimu kusasishwa kwa wakati halisi wakati wa utekelezaji wa SQL, kwa chaguo-msingi - kila sekunde. Baada ya utekelezaji kukamilika, habari kuhusu utekelezaji huhifadhiwa kwenye mtazamo V$SQL_MONITOR dakika nyingine, baada ya hapo huondolewa.

Mfano wa ripoti ya Ufuatiliaji wa SQL


KATIKA katika mfano huu Inadhania kuwa unachagua data kutoka kwa jedwali la SALES na kuendesha Ufuatiliaji wa SQL katika kipindi kingine.

Chaguo za kukokotoa za DBMS_SQLTUNE.REPORT_SQL_MONITOR zinaweza kukubali vigezo kadhaa vinavyoweka kikomo au kupanua kiwango cha maelezo ya ripoti, kwa kutumia vigezo vya ziada unaweza pia kubainisha umbizo la towe la ripoti (TEXT, HTML au XML), kwa chaguo-msingi ripoti inatolewa kwa maandishi. umbizo.

Ili kutambua utekelezwaji wa kipekee wa taarifa mbili za SQL, ufunguo wa mchanganyiko unaoitwa ufunguo wa utekelezaji hutolewa. Ufunguo huu lina sifa tatu, ambazo kila moja inarejelea safu katika V$SQL_MONITOR:

  • SQL_ID
  • Kitambulisho kinachozalishwa ndani ili kuhakikisha kuwa kilichotolewa ufunguo wa msingi kwa kweli ni ya kipekee (SQL_EXEC_ID)
  • Muhuri wa wakati wa kuanza kwa utekelezaji wa usemi (SQL_EXEC_START)

Tafsiri ya Mpango wa Utekelezaji



Hitimisho ELEZA MPANGO ni uwakilishi wa jedwali wa muundo wa mti wa mpango wa utekelezaji. Kila hatua (mstari katika mpango wa utekelezaji au nodi kwenye mti) inawakilisha Chanzo cha Safu.
Utaratibu wa nodes chini ya mzazi unaonyesha utaratibu wa utekelezaji wa nodes katika ngazi hiyo. Ikiwa hatua mbili ziko kwenye kiwango sawa, ya kwanza kwa mpangilio itatekelezwa kwanza.
Katika muundo wa mti, majani upande wa kushoto katika kila ngazi ya mti hutambua hatua ambayo utekelezaji huanza.
Hatua za mpango wa utekelezaji hazitekelezwi kwa mpangilio ambao zimehesabiwa. Kuna uhusiano wa mzazi na mtoto kati ya hatua.
Katika PLAN_TABLE na V$SQL_PLAN vipengele muhimu ili kupata muundo wa mti ni kitambulisho, PARRENT_ID na safu wima POSITION. Katika faili ya kufuatilia, safu wima hizi zinalingana na sehemu za id, pid, na pos, mtawalia.
Njia moja ya kusoma mpango wa utekelezaji ni kuibadilisha kuwa grafu ambayo ina muundo wa mti. Unaweza kuanza juu, kiingilio na ID=1 ndio sehemu ya juu ya mti. Hii ni kweli kwa shughuli ambazo zina parrent_id au pid thamani ya 1.
Ili kuwakilisha mpango kama mti, fanya yafuatayo:

  1. Chukua kitambulisho chenye thamani ya chini kabisa na ukiweke juu ya mti.
  2. Tambua safu mlalo ambazo zina PID (kitambulisho cha mzazi) sawa na thamani hii.
  3. Waweke kwenye mti hapa chini rekodi ya mzazi kulingana na maadili yao ya POS kutoka ndogo hadi kubwa kutoka kushoto kwenda kulia.
  4. Vitambulisho vyote vya mzazi vikishapatikana, nenda chini ngazi hadi Kitambulisho kinachofuata na urudie mchakato, ukitafuta safu mlalo mpya zilizo na PID sawa.
Jambo la kwanza kuamua katika mpango wa utekelezaji ni nodi gani inatekelezwa kwanza. Njia iliyoonyeshwa kwenye takwimu inaelezea jinsi ya kufanya hivyo, lakini wakati mwingine katika mipango ngumu ya utekelezaji ni vigumu kufanya hivyo na pia ni vigumu kufuata hatua zote hadi mwisho. Mipango tata haina tofauti katika utungaji kutoka kwa rahisi isipokuwa idadi ya hatua. Vile vile inatumika kwao sheria rahisi. Unaweza kuficha hatua katika mpango wako ambazo hazitumii rasilimali nyingi.
Njia ya kawaida ya kutafsiri mpango wa utekelezaji:
  1. Anza juu
  2. Sogeza chini shughuli hadi ufikie ile inayotoa data lakini haitumii chochote. Huu ni mwanzo wa operesheni.
  3. Angalia oparesheni za mtoto alizonazo mzazi huyu. Operesheni ya mtoto itafanywa kama ifuatavyo
  4. Sogeza juu ya mti hadi shughuli zote zikaguliwe.

Njia ya kawaida ya kutafsiri mti wa mpango wa utekelezaji ni:

  1. Anza juu
  2. Sogeza chini na kushoto kando ya mti hadi ufikie nodi ya kushoto, inatekelezwa kwanza
  3. Angalia watoto wa nodi hii. watoto hawa watanyongwa zaidi.
  4. Baada ya watoto kunyongwa, operesheni ya mzazi itaendelea kutekeleza.
  5. Sasa, baada ya operesheni hii na vizazi vyake vyote kukamilika, songa juu ya mti na uangalie vizazi vya mfululizo wa awali wa operesheni na wazazi wake. Inafanywa kulingana na kanuni hiyo hiyo.
  6. Nenda juu ya mti hadi shughuli zote zikaguliwe

Tafsiri ya Mpango wa Utekelezaji: Mfano 1

Kielelezo hapo juu kinaonyesha tafsiri ya mpango wa utekelezaji wa usemi. Swali lililoonyeshwa kwenye takwimu linajaribu kupata wafanyakazi ambao mishahara yao ni tofauti na gridi ya mishahara. Hoja huchagua data kutoka kwa majedwali mawili na inajumuisha hoja ndogo kulingana na uteuzi kutoka kwa jedwali lingine ili kuangalia viwango vya mishahara.
Hebu tuangalie utaratibu wa utekelezaji wa ombi hili. Kulingana na takwimu hii na iliyotangulia, agizo la utekelezaji litakuwa kama ifuatavyo: 3-5-4-2-6-1:

  • 3: utekelezaji wa mpango utaanza kwa uchanganuzi kamili wa jedwali la EMP (ID=3)
  • 5: safu mlalo hupitishwa kwa hatua ya kudhibiti kitanzi kilichowekwa kiota (ID=2), ambacho huzitumia kutafuta safu mlalo katika faharasa ya PK_DEPT (ID=5)
  • 4: ROWID za safu mlalo zilizopatikana baada ya kuchanganua PK_DEPT hutumika kupata maelezo mengine kutoka kwa jedwali la DEPT (ID=4)
  • 2: ID=2, mchakato wa kuunganisha kitanzi kiota utaendelea hadi ukamilike
  • 6: Baada ya ID=2 kuchakata safu mlalo chanzo zote za kiunganishi, uchanganuzi kamili wa jedwali SALGRADE (ID=6) utafanywa.
  • 1: Data iliyopokelewa baada ya kutekeleza ID=6 itatumika kuchuja safu mlalo kutoka ID=2 na ID=6
Michakato ya mtoto hutekelezwa kabla ya mchakato wa mzazi, ingawa miundo ya uunganisho lazima iundwe kabla ya mchakato wa mtoto kutekelezwa. Labda njia rahisi zaidi ya kuelezea agizo la utekelezaji ni kwamba kufanya operesheni ya kujiunga ya NESTED LOOPS na ID=2, watoto wawili (ID=3 na ID=4 (pamoja na watoto wao)) lazima wamalize utekelezaji wao kabla ya ID=2 kutekelezwa.

Tafsiri ya Mpango wa Utekelezaji: Mfano 2


Hoja hii inarejesha majina, majina ya idara na anwani za wafanyikazi ambao idara zao ziko Seattle na ambao wana msimamizi.

Kwa urahisi wa kupangilia, nambari nyingine imeongezwa kwenye takwimu. Safu wima iliyo upande wa kushoto inawakilisha kitambulisho na safu wima iliyo upande wa kulia inawakilisha PID. Mpango wa utekelezaji wa hoja unaonyesha shughuli mbili za NESTED LOOP JOIN. Tunatafsiri mpango wa utekelezaji kulingana na njia iliyowasilishwa hapo juu:

  1. Hebu tuanze kutoka juu. ID=0
  2. Tunashusha shughuli hadi tufikie ile inayotoa data lakini haitumii chochote. KATIKA kwa kesi hii,ID 0,1,2, na 3 wanatumia data. ID=4 ni operesheni ya kwanza kutoka juu ambayo haitumii rasilimali, lakini hutoa data. Hiki ndicho chanzo cha kwanza cha data. INDEX RANGE SCAN itarudisha ROWID ya safu mlalo zitakazotumika kurejesha data kutoka kwa jedwali la LOCATIONS (ID=3)
  3. Wacha tuangalie ndugu wa chanzo hiki cha safu ambao wako kwenye kiwango sawa na kwenye mti. Ndugu na dada katika ngazi sawa wana ID=3 na ID=5. ID = 5 ina mtoto - ID = 6, ambayo itatekelezwa kabla yake. Huu ni operesheni ya INDEX RANGE SCAN kwenye faharasa nyingine, ikirudisha ROWID ambayo baadaye itatumika kupata data kutoka kwa jedwali la DEPARTMENTS wakati wa utekelezaji ID=5.
  4. Baada ya operesheni ya mtoto kutekeleza, udhibiti huhamishiwa kwa babu yake. Operesheni inayofuata itakuwa NESTED LOOPS yenye ID=2 ili kuchanganya data iliyopokelewa hapo awali.
  5. Sasa kwa kuwa operesheni ya mzazi na vizazi vyake vyote vimekamilika, tunapanda juu ya mti na kuona ikiwa operesheni ya mzazi ina kaka na dada walio katika kiwango sawa na hiyo. ID=2 iko kwenye kiwango sawa na Operesheni ID=7 ambayo ina mtoto ID=8. Mtoto huyu atanyongwa kwanza. INDEX UNIQUE SCAN itatekelezwa ili kupata ROWID za safu mlalo, ambazo zitatumika kupata data kutoka kwa jedwali la WAFANYAKAZI katika operesheni ID=7.
  6. tunahamia kiwango cha juu baada ya shughuli zote katika kiwango cha sasa na vizazi vyao kuchakatwa. Operesheni ya mwisho itakayofanywa itakuwa ni kuunganisha NESTED LOOPS na ID=1, kisha matokeo yatatumwa ID=0.
  7. Utaratibu wa operesheni ni kama ifuatavyo: 4-3-6-5-2-8-7-1-0

Chini ni maelezo ya kina mpango wa utekelezaji:

Kwanza, kitanzi kilichowekwa ndani hutekelezwa kwa kutumia LOCATIONS kama jedwali linaloongoza, kwa kutumia ufikiaji wa faharasa kwenye safu wima ya CITY. Operesheni inafanya kazi kwa sababu unatafuta idara zilizo Seattle pekee.

Matokeo yameunganishwa kwenye jedwali la DEPARTMENTS kwa kutumia faharasa kwenye safu wima ya LOCATION_ID kwa kujiunga. Matokeo ya operesheni ya kwanza ya kujiunga ndiyo chanzo kikuu cha data kwa kitanzi cha pili kilichowekwa kiota.

Operesheni ya pili ya kujiunga inachunguza faharasa kwenye safu wima ya EMPLOYEE_ID ya jedwali la WATUMISHI. Operesheni hii inaweza kufanywa kwa sababu mfumo unajua (kutoka operesheni ya kwanza ya kujiunga) vitambulisho vya wasimamizi wote wa idara huko Seattle. Katika hali hii, UNIQUE SCAN inafanywa kwa sababu uchanganuzi unafanywa kwenye faharasa ya ufunguo msingi.

  • Kwanza, mfumo huweka jedwali T3 kwenye kumbukumbu (ID=3)
  • Mfumo kisha huharakisha jedwali T1 kwenye kumbukumbu (ID=5)
  • Kisha skanning ya meza T2 (ID-6) huanza
  • Mfumo huchukua safu mlalo kutoka T2 na kuchunguza T1 (T1.i=T2.i)
  • Ikiwa laini itasalia, mfumo huitafuta katika T3 (T1.i=T3.i)
  • Ikiwa safu itasalia, mfumo huipitisha kwa operesheni inayofuata.
  • Masuala ya mfumo thamani ya juu kutoka kwa seti ya awali ya matokeo.
  • Utaratibu wa utekelezaji ni kama ifuatavyo: 3-5-6-4-2-1

    Utaratibu wa kuunganisha: T1-T2-T3

    Kusoma Mipango Kamili Zaidi ya Utekelezaji


    Mpango ulioonyeshwa kwenye takwimu upande wa kushoto umejengwa kutoka kwa swali kutoka kwa kamusi ya data. Ni muda mrefu sana, hivyo ni vigumu sana kutumia mbinu za tafsiri za awali ili kupata operesheni ya kwanza.

    Unaweza kufupisha muhtasari ili kuifanya isomeke zaidi. Takwimu iliyo upande wa kulia inaonyesha mpango sawa wa utekelezaji, uliofupishwa tu. Kama inavyoonyeshwa kwenye takwimu, hii ni rahisi kufanya kwa kutumia Enterprise manager au SQL*Developer. Kama inavyoonekana kwenye takwimu, mpango huo ni pamoja na operesheni ya kuunganisha matawi mawili. Ujuzi wa kamusi ya data huturuhusu kuelewa kuwa matawi haya mawili yanalingana na nafasi za meza zinazodhibitiwa na kamusi na zinazodhibitiwa na eneo. Maarifa kuhusu hifadhidata hukuruhusu kuelewa kwamba hifadhidata haina nafasi za meza zinazodhibitiwa na kamusi. Kwa njia hii, ikiwa kuna shida, iko kwenye tawi la pili. Ili kuthibitisha mawazo yako, unahitaji kuangalia maelezo ya mpango na takwimu za utekelezaji za kila chanzo cha safu mlalo ili kubaini sehemu ya mpango inayotumia rasilimali nyingi zaidi. Kisha unahitaji kupanua tawi ambalo matatizo yanapatikana. Ili kutumia mbinu hii, lazima utumie takwimu za utekelezaji, ambazo zinaweza kupatikana katika mwonekano wa V$SQL_PLAN_STATISTICS au katika ripoti ya tkprof inayotokana na faili ya kufuatilia. Kwa mfano, tkprof hufanya muhtasari wa muda ambao kila operesheni ya mzazi inachukua kutekeleza pamoja na muda wa utekelezaji wa shughuli zote za mtoto.

    Muhtasari wa Mpango wa Utekelezaji

    Unapoweka usemi wa SQL katika mazingira ya OLTP, lengo ni kuanza na jedwali ambalo lina kichujio cha juu zaidi cha kuchagua. Hii ina maana kwamba safu mlalo chache zitapitishwa kwa operesheni inayofuata. Ikiwa hatua inayofuata ni uunganisho, inachukuliwa kuwa safu mlalo chache zitaunganishwa. Pia unahitaji kuhakikisha kuwa njia za ufikiaji wa data ni bora. Unapochunguza mpango wa utekelezaji, kumbuka yafuatayo:

    • Mpango huo umeundwa ili chujio bora kinatumika kwenye meza inayoongoza
    • Agizo la uunganisho limeundwa ili idadi ndogo zaidi ya safu ipitishwe kwa hatua inayofuata (yaani, agizo la uunganisho liende kwa vichungi bora ambavyo bado havijatumika)
    • Mbinu ya kuunganisha inalingana na idadi ya safu mlalo ambazo hupitishwa kwake ili kuunganishwa. Kwa mfano, NESTED LOOP kujiunga kwa kutumia faharasa huenda isiwe bora wakati safu mlalo nyingi zinarejeshwa.
    • Maoni hutumiwa kwa ufanisi. Angalia CHAGUA orodha ili kuamua ni wapi mwonekano unahitaji kufikiwa.
    • Hakuna shughuli za bidhaa za Cartesian za meza (hata na meza ndogo).
    • Kila meza inasoma kwa ufanisi: fikiria Vihusishi vya SQL maneno kuhusiana na idadi ya safu katika jedwali. Angalia shughuli zinazotiliwa shaka kwa undani, kwa mfano uchanganuzi kamili wa jedwali kwa majedwali kiasi kikubwa mifuatano iliyo katika kiima.

    Uchanganuzi kamili wa jedwali unaweza kutumika kwa ufanisi kwa meza ndogo, au kwa programu aina maalum huunganisha (km HASH JOIN) kwa safu mlalo zilizorejeshwa.

    Ikiwa mojawapo ya masharti yaliyo hapo juu si bora, utahitaji kuandika upya SQL au kukagua faharasa zinazopatikana kwenye jedwali.

    Mpango wa utekelezaji yenyewe hauwezi kutoa taarifa kuhusu ufanisi wa utekelezaji wa hoja. Kwa mfano, matokeo ya EXPLAIN PLAN yanaweza kuonyesha matumizi ya faharasa, lakini hii haimaanishi kuwa usemi huo ni mzuri. Wakati mwingine kutumia index inaweza kuwa duni sana.

    Kwa kuamua mpango bora utekelezaji, unahitaji kupata mpango wa awali, na kisha uiboresha kwa utekelezaji bora zaidi kwa kutumia majaribio. Wakati wa kubadilisha mpango wa utekelezaji, unahitaji kufuatilia matumizi ya rasilimali za mfumo.