oracle優化--shared_pool (2)

wangyiou1988發表於2012-04-28

如果兩個SQL語句只有常量有差別的話 他們是不能共享的:
select * from emp where empno='01';
select * from emp where empno='02';
oracle 就會認為他倆不一樣,就會進行硬解析
oracle 提供了一個初始變數:cursor_sharing 它有三個值
exact 精確的
similar 類似的
force 強制的
系統預設是精確的,即必須完全一樣,當我們設定成similar的時候,像以上的一種情況,oracle就會走軟解析,因為差不多,
FORCE的程度就更深了,但我們輕易不會修改這個引數,因為他也是有代價的。
那麼,如何檢視系統中進行硬解析的次數呢?我們檢視一個動態效能檢視v$sysstat;
SQL>select * from v$sysstat; 其中有一行如下
233 parse count(hard) 一個值M 一個值N
當我們執行一個從前沒有執行過的SQL語句時,再次檢視就會發現N就會增大。N就是執行硬解析的次數
還有一個效能檢視V$sgastat,通過這個檢視我們可以檢視SGA各個元件的尺寸,最重要的就是shared_pool的剩餘空間,這也很重要。如果記憶體不夠,就會報ORA-04031這個錯誤,解決的方法就是擴記憶體或者減少記憶體的使用。
我們通過show parameter share可以檢視到shared_Pool_size


接著上面的說一說,如果兩個語句想要解析,必須要引用相同的物件,而且必須要在同一個schema(模式)裡,每一個使用者都有一個schema,他和使用者重名,是當前使用者下所有物件的集合,使用者和模式是有差別的,許可權,密碼,約束都不是模式。使用兩個使用者都執行:
SQL>select * from emp;在他們各自的schema裡都有EMP這個表,表面上是一樣的,但是這是兩張截然不同的表,還是要進行硬解析。

當我們進行兩個差不多的SQL語句時,比如只有WHERE條件的常量不同,在不改變cursor_sharing的情況下,如何使語句共享,產生軟解析呢?答案就是繫結變數,當where一個條件的時候,把內容寫成變數,但注意,繫結變數必須相同才能共享。儘可能的使用繫結變數,已經成為優化的一個重要部分。

--TO BE CONTINUED

[@more@]

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

相關文章