探索系列——神人steve adams之著oracle8i interal service(十四)

wisdomone1發表於2010-04-25
    比如,在對一個資料庫segment段進行一個直接讀操作前,讀程式或者並行查詢協調器發出一個ci跨例項呼叫,給dbwn程式,要求dbwn程式,把屬於這個segment的所有快取的髒塊實行一次檢查點活動的dbwn程式.
利用鎖值塊把這個segment上面的所有的資料庫物件的編號聯絡起來.同樣,在truncate這個segment之前,重新利用block範圍內的ci,用於確保這些受影響的block範圍上面的髒快取塊被全部flush到磁碟上,而且
清除或清理受影響範圍塊block的快取塊之中標識為無效的部分.
     儘管使用一些跨例項的呼叫ci(原文:despite their name,many cross-instance calls are used,單例項如同在ops環境下一樣,也會使用對應的ci enqueue.




library cache instance locks
     在並行伺服器資料庫情況下,一些library cache lock和pins也需要全域性顯露.請記住,library cache locks用於解析呼叫期間,pins用於執行呼叫期間,防止衝突ddl.在並行伺服器ops下,防止在所有的例項上出現衝突的ddl,是非常有必要的.為了達到這個目標,
在資料庫物件上加上全域性的library cache locks和pins是很有必要的sufficient.(次級)從屬或依賴的物件如:cursors,它們上面的本地鎖及pin是不需要全域性顯露的,因為它們間接會得到保護,假如它們所依賴的物件得到保護的話.

     更進一步意識到,以null mode保持或持有的本地library cache locks,會使快取的library cache object失效,原因在於它們所依賴的物件定義應該發生了改變.
一個資料庫物件在多個例項上要提供相同的功能,透過對library cache中快取的所有資料庫物件,以共享模式持有一個iv(invalidatation)例項鎖.需要從全域性上使一個物件定義無效的任何程式,它僅僅只是對相同的資源持有一個排它鎖,因此導致或引起lck0程式刪除它們共享的鎖並且
使這個物件無效或不合理.


     採用隱含引數可以禁用global library cache locks,pins,及iv(invalidation locks).不建議這樣作,除非完全禁用了dml locks.




pcm instance locks

   pcm(parallel cache management)並行快取管理lock鎖不會直接保護cache buffers---至少不會直接保護.pcm locks保護資料結構,這個資料結構就叫lock element鎖要素或鎖成分或鎖分子.而每個lock element保護一系列資料塊,這資料塊不是cache buffers.但是,包括這些資料塊(非cache buffers)的任何cache buffers會連結到它們的lock element.
        (pcm lock 保護lock element,這個lock element保護一系列的資料塊,請注意這個資料塊不是cache buffer.
         包括這些資料塊data block的任何cache buffers會連結到它們的lock element)


   lock elements鎖元素也叫作全域性快取鎖global cache locks,但這個術語本身沒有什麼多大作用,因為它們既不是鎖也不是資源.它們是在pcm例項鎖和cache buffers之間的一個intersection十字交叉點entry條目.




fixed lock elements
    lock elements鎖元素既可以release也可以是固定的.可以release的鎖元素lock elements可能用於雜湊hashed或者精良提練fine-grained的locking,但是固定的lock elements僅僅用於hashed locking.
要是使用hashed locking,資料塊透過一個雜湊演算法對映到lock elements,這樣每個lock elements可以馬上保護一些快取塊.但是對於fine-grained鎖定locking,lock elements每次會動態分配,保護一個單一的快取塊.




   資料塊與hashed lock elements的對映關係,以及它們到底是固定或releasable的lock elements,是由gc_files_to_locks和gc_rollback_locks引數來確定的.固定的lock elements的數量是源於這些配置.用於hashed locking的release lock elements的數量,必須小於利用gc_releasable_locks引數配置的releasable lock elements的數量,預設是
快取中buffer的數量.餘下或剩下的releasable lock elements用於fine-grained locking.
   
   fixed固定的和releaseable hashed locking表示出同樣的效能,除了一個非常重要的方面.在例項啟動期間,lckn程式必須以null mode獲取所有固定lock elements的例項鎖.這可能要花費幾分鐘.releasable hashed locking會在例項活動的初始或開始增加期,diffuses這個成本.從那之後,這兩種形式的hashed locking效能是一樣的喲.請注意:releasable
hashed lock elements之上的鎖控制程式碼,實際上是不會released,雖然lock element可以被releasable.從這個層面來講,你應該為hashed locking僅僅使用releasable lock elements,而不要使用固定的fixed lock elements.

  




hashed locking
    當一個塊放入快取中,這個將會得到保有存的快取之下的lock element,必須要確認下來(譯得彆扭:原文the lock element under which it will be protected must be determined),buffer必須被連結到lock element。具體如何實現取決下這個塊到底是採用fine-grained或者
hashed locking,對於hashed locking,它也依賴於或者與塊的型別或級別有關.會區別處理rollback segment blocks和data blocks.
    對於愛制於hashed locking的資料塊,這裡有一個索引條目,由它對映檔案編號和lock element buckets的關係,以及一個bucket header array,這個array會標識每個bucket上面一系列lock elements.查詢x$kclfi及x$kclfh可以查詢到這些array佇列的資訊.對於rollback segment blocks,
同樣查詢x$kclui及x$kcluh可以查詢到它對應的佇列資訊.在例項啟動時,根據gc_files_to_locks和gc_rollback_locks會建立這些佇列.


    當一個rollback segment block或data block放入快取中,這些佇列(以上)用於查詢正確的lock element bucket.此時不需要用latch,因為這些佇列是靜態的或靜止的.選取用於保護來自於buckets之間某一個特定的塊,就是塊編號減去2,然後除以這個bucket的blocking factor,最後再除以這個bucket之中的lock element數目,得出的最終結果四捨五入.
哈布函式從塊編號中減去2,而不是減去1,因為你要考察到檔案頭塊file header block,同時(而且)確信,如果blocking factor被選擇用於以塊表示的extent 大小的公約數(整數),此時lock element覆蓋範圍將align到extent的boundaries界限內或範圍內.另者,每個bucket中lock element個數採用質數,確保均勻把這些塊分配到對應的lock elements,這也是
最好的一種方法,而不管(不關心)資料庫segments內部的資料分佈情況.

    lock elements的一種更為嚴重的集中,應該被分配到資料檔案,這個資料檔案可能競爭hashed pcm例項鎖.如果資料檔案上面的塊發生了變化,並且多個例項會訪問這些塊,出現競爭的可能性很大.


  

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-660689/,如需轉載,請註明出處,否則將追究法律責任。

相關文章