欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

OracleCursor的相關(guān)知識點有哪些

本篇內(nèi)容介紹了“Oracle Cursor的相關(guān)知識點有哪些”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供東勝網(wǎng)站建設(shè)、東勝做網(wǎng)站、東勝網(wǎng)站設(shè)計、東勝網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、東勝企業(yè)網(wǎng)站模板建站服務(wù),十年東勝做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。

游標(biāo)是一個基本對象,它是SQL語句或PL/SQL編程式構(gòu)造的一種完整可執(zhí)行表示,可以被任何授權(quán)會話使用和重用。游標(biāo)必須被創(chuàng)建,定位(通過搜索來查找),消毀(回收),失效與重載。如果游標(biāo)的任何部分不在共享池中,并且出于任何原因需要,則必須重新加載該游標(biāo),這會降低性能。

開發(fā)人員通常對游標(biāo)有很好的理解因為他們需要專門創(chuàng)建,打開,執(zhí)行,獲取與關(guān)閉游標(biāo)。DBA通常將游標(biāo)作為與SQL相關(guān)的簡單內(nèi)存塊來看待。然而,這種過于簡單的關(guān)點限制了我們?yōu)榕c游標(biāo)相關(guān)的性能問題創(chuàng)建解決方案的能力。因此,如果花時間更好地理解游標(biāo),將會注意到性能解決方案選項將顯著增加。

父游標(biāo)與子游標(biāo)
游標(biāo)這個術(shù)語本身是一個抽象概念,用來引用共享的信息(位于共享SQL區(qū)),私有信息(位于會話的PGA)與用來定位各種游標(biāo)組件的library cache chain節(jié)點(當(dāng)引用library cache時就叫作handle)。不幸地是這種多用途的定義也增加了混淆。當(dāng)一個游標(biāo)被關(guān)閉時,Oracle不會簡單的回收這三個游標(biāo)組件。而是Oracle可能會按需來回收游標(biāo)組件。

一個游標(biāo)第一次執(zhí)行時,會存在一個父游標(biāo)與子游標(biāo)。后續(xù)的會話,即使相同的會話執(zhí)行相同的SQL語句(哈希值相同),可能會使用不同的子游標(biāo)。雖然SQL語句在文本上完全相同,但是創(chuàng)建子游標(biāo)是為了捕獲特定的特征,比如優(yōu)化模式的差異(例如first_rows),這會導(dǎo)致不同的執(zhí)行計劃或不同的會話級參數(shù)(cursor_sharing=similar)。下面的例子簡單的顯示了相同會話執(zhí)行相同SQL語句兩次,只是在兩次執(zhí)行之間執(zhí)行了alter session命令,這足以強(qiáng)制創(chuàng)建一個額外的子游標(biāo)。trace命令用來證明創(chuàng)建了兩個子游標(biāo)。

SQL> oradebug setmypid
Statement processed.
SQL> alter session set optimizer_mode = all_rows;
Session altered.
SQL> select * from dual;
D
-
X
SQL> alter session set optimizer_mode = first_rows;
Session altered.
SQL> select * from dual;
D
-
X
SQL> alter session set events 'immediate trace name library_cache level 10';
Session altered.
SQL> oradebug tracefile_name
/u01/app/oracle/diag/rdbms/jy/jy1/trace/jy1_ora_6675.trc

下面的內(nèi)容是上面的trace命令所創(chuàng)建的跟蹤文件中的一部分內(nèi)容。我們通過搜索select * from dual來定位我們關(guān)心的內(nèi)容并檢查SQL語句。此時,我們感興趣的是,這條SQL語句僅由一個會話執(zhí)行,但它創(chuàng)建了兩個子游標(biāo)。

Bucket: #=108289 Mutex=0xc5eeae00(3298534883328, 1118, 0, 6)
  LibraryHandle:  Address=0xcf2e9a48 Hash=382da701 LockMode=0 PinMode=0 LoadLockMode=0 Status=VALD
    ObjectName:  Name=select * from dual
      FullHashValue=0d54fc02b2ad4044a2cb0974382da701 Namespace=SQL AREA(00) Type=CURSOR(00) ContainerId=1 ContainerUid=1 Identifier=942515969 OwnerIdn=0
    Statistics:  InvalidationCount=0 ExecutionCount=2 LoadCount=3 ActiveLocks=0 TotalLockCount=2 TotalPinCount=1
    Counters:  BrokenCount=1 RevocablePointer=1 KeepDependency=2 Version=0 BucketInUse=1 HandleInUse=1 HandleReferenceCount=0
    Concurrency:  DependencyMutex=0xcf2e9af8(0, 2, 0, 0) Mutex=0xcf2e9b98(768, 37, 0, 6)
    Flags=RON/PIN/TIM/PN0/DBN/[10012841] Flags2=[0000]
    WaitersLists:
      Lock=0xcf2e9ad8[0xcf2e9ad8,0xcf2e9ad8]
      Pin=0xcf2e9ab8[0xcf2e9ab8,0xcf2e9ab8]
      LoadLock=0xcf2e9b30[0xcf2e9b30,0xcf2e9b30]
    Timestamp:  Current=04-17-2019 09:33:16
    HandleReference:  Address=0xcf2e9c20 Handle=(nil) Flags=[00]
    ReferenceList:
      Reference:  Address=0x84497a08 Handle=0x818e2850 Flags=ROD[21]
      Reference:  Address=0x84c9e3d0 Handle=0xb28b76a0 Flags=ROD[21]
    LibraryObject:  Address=0xbd5972a8 HeapMask=0000-0001-0001-0000 Flags=EXS[0000] Flags2=[0000] PublicFlags=[0000]
      DataBlocks:
        Block:  #='0' name=KGLH0^382da701 pins=0 Change=NONE
          Heap=0x83043cc0 Pointer=0xbd597378 Extent=0xbd597200 Flags=I/-/P/A/-/-/-
          FreedLocation=0 Alloc=3.390625 Size=3.976562 LoadTime=4111958371
      ChildTable:  size='16'
        Child:  id='0' Table=0xbd598128 Reference=0xbd597bf8 Handle=0xb38e2928
        Child:  id='1' Table=0xbd598128 Reference=0xbd597f48 Handle=0xbdfc20a8
    NamespaceDump:
      Parent Cursor:  sql_id=a5ks9fhw2v9s1 parent=0xbd597378 maxchild=2 plk=n ppn=n prsfcnt=0 obscnt=0
        CursorDiagnosticsNodes:
          ChildNode:  ChildNumber=0 ID=3 reason=Optimizer mismatch(10) size=3x4 optimizer_mode_hinted_cursor=0 optimizer_mode_cursor=1 optimizer_mode_current=2

庫緩存對象之間的關(guān)系不僅為執(zhí)行目的而必須維護(hù),而且當(dāng)其中一個組件發(fā)生更改時也必須維護(hù)。假設(shè)一個表被2000個SQL語句,100個函數(shù)與20個包所引用?,F(xiàn)在假設(shè)表的一列被重命名。Oracle將會使所有相關(guān)的SQL語句與程序結(jié)構(gòu)失效。這可能導(dǎo)致在請求latching與locking時出現(xiàn)級聯(lián)效應(yīng)。多個相關(guān)會話、失效、重新編譯和計時的組合導(dǎo)致整個Oracle實例被鎖定。很明顯Oracle已經(jīng)知道了這種問題的嚴(yán)重性并且積極的減小出現(xiàn)這種情況的可能性。但每個DBA要了解library cache之間的關(guān)系是非常復(fù)雜的并且有時可能導(dǎo)致出現(xiàn)問題。

Cursor Building
當(dāng)在library cache中搜索并沒有找到游標(biāo)時就會創(chuàng)建游標(biāo)。這就是硬解析。很明顯這是一個相對昂貴的操作它需要請求內(nèi)存管理(分配與可能回收),使用latching來確保序列化,使用locking來阻止不合適的更改,執(zhí)行內(nèi)核代碼需要消耗CPU資源,和可能需要IO操作來將數(shù)據(jù)字典信息插入row cache中。

游標(biāo)是使用共享池中的數(shù)據(jù)來創(chuàng)建的,如果數(shù)據(jù)當(dāng)前不在共享池中,Oracle將創(chuàng)建它自己的SQL語句來從數(shù)據(jù)字典表中檢索數(shù)據(jù)。Oracle動態(tài)創(chuàng)建的SQL會命名為遞歸SQL并運(yùn)行它。為了創(chuàng)建一個游標(biāo)Oracle需要的數(shù)據(jù)是優(yōu)化器統(tǒng)計信息,會話信息,安全信息,對象信息與對象關(guān)聯(lián)信息。

游標(biāo)是由稱為堆的共享池內(nèi)存塊創(chuàng)建的。傳統(tǒng)上,不同的SQL語句需要不同大小的內(nèi)存塊。常見的SQL語句通常請求4KB大小的內(nèi)存塊。與free exten管理一樣,請求不一致大小的內(nèi)存塊會導(dǎo)致分配,性能與效率問題。從Oracle 10gr2開始,Oracle將所有的內(nèi)存塊定義為4KB。當(dāng)合適的內(nèi)存塊不能快速地找到時,Oracle最終可能會放棄并posts一個4031錯誤“out of shared poll memory”并停止SQL語句的處理。

Cursor Searching Introduction
與buffer cache中的每個buffer一樣,每個父游標(biāo)與子游標(biāo)必須被定位并且搜索必須要快速。這將請求內(nèi)存,一個搜索結(jié)構(gòu),序列化,內(nèi)核代碼與大量CPU資源。

因為游標(biāo)與程序結(jié)構(gòu)存放在library cache中,有一個結(jié)構(gòu)來定位對象。Oracle選擇使用哈希算法與相關(guān)哈希類似結(jié)構(gòu)。解析操作的一部分是判斷一個游標(biāo)當(dāng)前是否存放在library cache中了。如果確實在library cache中找到了這個游標(biāo),進(jìn)行了一些解析操作,因此它確實是一個軟解析。然而如果在library cache中沒有找到這個游標(biāo),整個游標(biāo)需要被創(chuàng)建,因此它就是硬解析。游標(biāo)創(chuàng)建與硬解析是相當(dāng)昂貴的操作。

Cursor Pinning and Locking
固定游標(biāo)類似于固定buffer。它被用來確保當(dāng)游標(biāo)被引用時不會被回收(有時也叫破壞)。游標(biāo)顯然不是關(guān)系結(jié)構(gòu),但是SQL與關(guān)系結(jié)構(gòu)(例如employee表)相關(guān),關(guān)系結(jié)構(gòu)用于構(gòu)建游標(biāo)(例如sys.col$),因此使用了鎖——也就是說,使用了隊列。游標(biāo)隊列也叫作CU隊列并且就像其它隊列一樣通過Oracle的等待接口可以檢測。

當(dāng)創(chuàng)建與執(zhí)行游標(biāo)時就要固定游標(biāo)。這是很容易理解的,當(dāng)你創(chuàng)建一個游標(biāo)時,它是一種內(nèi)存結(jié)構(gòu),你不想其它的進(jìn)程回收相關(guān)的內(nèi)存。正常情況下,游標(biāo)在創(chuàng)建與執(zhí)行完成后不會出現(xiàn)固定的情況。這意味著在你執(zhí)行一個游標(biāo)后且等待2分鐘后你想再次執(zhí)行相同的游標(biāo),這時游標(biāo)可能已經(jīng)被回收了。如果出現(xiàn)這種情況,在library cache中找不到需要的游標(biāo),將會執(zhí)行硬解析,它將完全重新創(chuàng)建游標(biāo)。

在創(chuàng)建與執(zhí)行游標(biāo)時也可能會出現(xiàn)鎖定的情況。但它不同于固定游禁。固定的關(guān)注點在于內(nèi)存回收。而鎖是確保與游標(biāo)相關(guān)的表在創(chuàng)建與執(zhí)行游標(biāo)時不被修改。顯然,這可能會造成一些相當(dāng)奇怪的情況,而Oracle不會允許這種情況發(fā)生。

“Oracle Cursor的相關(guān)知識點有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

網(wǎng)頁名稱:OracleCursor的相關(guān)知識點有哪些
瀏覽路徑:http://chinadenli.net/article22/ihspjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、手機(jī)網(wǎng)站建設(shè)、用戶體驗、面包屑導(dǎo)航、自適應(yīng)網(wǎng)站網(wǎng)站設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)