由最長SQL想到的Latch Free( Library Cache Pin/Lock)整理~~草稿

Karsus發表於2008-11-03

今天回想這中間的過程:

這句SQL 導致Parseexecute佔用大量資源,Parse的過程需要一直持有Library Cache,而Library Cache Latch的個數是有限的,這點引起了Library Cache的競爭。Library Cache PinContention有點疑惑,這可能也是一個我概念比較模糊的地方,今天又上MetalinkPUB上找了很多。

借這次的現象整理了一下(順便兼帶Library Cache Lock):

[@more@]

Library Cache Pin/Lock Library Cache Pin Latch是什麼?

這是我經常感到疑惑的,很多人講了很多,看完卻也覺得說不清。上午看到PUB上今年6月份的關於Latch的帖子,其中BITI_RAINY的說法給我很大啟發。

最主要集中在Library Cache Pin/Lock 是不是Latch? 似乎常看到Latch Free的等待是Library Cache Pinwait event

我現在理出來的思路是:Library Cache Pin/Lock是一種鎖定機制,而Library Cache Pin/Lock Latch責是實施這種機制之前的閂。

也就是說,想在Library Cache中幹PinLock2件事,該Process必須先獲得對應的Latch,只有拿到了Latch,才能接下去做Pin/Lock。從這個角度說,可以把Library Cache Pin/LockObtain Library Cache Pin/Lock Latch 等同起來。

Wait event Library Cache Pin發生於,引用Metalink Doc.34579.1的原文:

A wait for “Library Cache Pin” implies some other session holds that PIN in an incompatible Mode.

Library Cache Mode 3 null, share, exclusive.

Incompatible mode 也就是在shareexclusive之間, 2個模式是需要序列的 (當然exlusiveexclusive也是)。

這裡又一個問題出來了:

從這段話能得出一個結論,就是Share Share這種模式,Compatible,是可以同時被2Session同時Pin的。--1

但我們在v$session_wait中發現的wait event Library Cache Pin 是屬於Latch Free這個大類也就說waiting的是Library Cache Pin Latch,而Latch是一種序列化的機制,只有一個Process能獲得。--2

結合12 有個推論,Process在獲得Library Cache Pin Latch並且在可以Pin之後會釋放這個Latch

舉一個High Activity InstanceCompile Procedure經常出現的問題,系統Hang住,很多Sessionwait events Library Cache Pin

Compile的時侯,所要獲得的Library Cache Pinmodeexclusive。由於很多ProcedureDependence很複雜,而如果Library Cache中的一個objectPIN,那相關的objects都必須被PIN住。但相關object可能被other session Pined with incompatible Mode,此時進行CompileSession就不得不花很多時間來Pin住其他的Objects,這樣會長期持有Library Cache Pin exclusive Mode, 當其後第一個Session 獲得了Library Cache Pin Latch的時侯,發現無法Pin住,按EYGLE的說法,取得PIN之前最多3秒,那這3秒中後續的Session則只能waiting for Libraray Cache Pin Latch.

在上週的案例中,並沒有在進行Compile,有的只是Cost expensive Hard ParseHard Parse的過程中會用到下面的這些Latch

Library Cache

Shared Pool

Library Cache Lock

Library Cache Pin

Library Cache Pin Allocation

做個實驗:

Alter system set “_kgl_latch_count”=1 scope=spfile;

Restart Instance.

發現個有個有趣的現象:Library Cache LatchChildren變為1Library Cache Pin Latch,和Library Cache Pin Allocation Latchchildren也變為1了。

看來_kgl_latch_count控制著所有關於Library CacheLatch chilren的數目

另外9i裡是沒有Library Cache Lock這個Latch的,10g才有(還是說不是獨立Latch?)

然後開起多個Session查詢同一個TableWhere條件只有一個。

第一次測試是用了PL/SQL寫的Procedure.測試的Bind Variable 情形:

觀察到的Latch ContentionCache Buffer Chains, 沒有觀察到Library Cache方面。

第二次是用Shell呼叫SQLPLUS Literal SQL,結果什麼也沒觀察到,估計是這種方式execution頻率還不算高,計劃構造複雜SQL再測試下。

所以Soft ParseExecute的時侯Pinshared mode.

Wait event Library Cache Pin按前述只能發生於Library Cache Pinexclusive佔住的情形。所以當有Library Cache Pin發生的時侯,基本可以判斷為有Hard Parse, Compile, DDL等。

另外在測試中發現一個現象,一句SQL執行後,Library Cache, Library Cache Pin, Library Cache Pin Allocation中增加的Gets計數都在同一編號的CHILD#上。

也就是說這三個Latch 是一組提供服務的,所以我想大概每組會負責Hash Bucket Array的一部分。

To be continued...

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

相關文章