3.硬解析,軟解析,軟軟解析

v$sql ->存子游標信息(每一個子遊標對應一次硬解析),關鍵信息是執行環境和執行計劃
sql

v$sqlarea ->存父遊標信息,對應sql語句的文本oracle


在v$sql中一個sql_id會存在多條語句,實際上v$sql中sql_id和child_number共同肯定一個惟一的sql,緣由是一個sql_id對應多個子遊標。ide

  1. 不一樣schema下相同sql,sql_id相同,單查詢的對象不是同一用戶測試

  2. 因爲統計信息或者變量窺視,致使執行計劃變化對象


遊標的概念:指內存中可執行的sql對象,即SQL已經生成了執行計劃。內存


 父子游標都是能夠共享的,稱爲共享遊標,sql執行以前還要在會話的私有內存裏生成1個會話遊標,用於保存執行過程信息,這個在不一樣會話間是不能共享的,會話遊標對應的視圖v$open_cursorci


硬解析:共享池中找不到遊標,須要從新生成執行計劃,即子游標(也可能包括父遊標)hash

軟解析:共享池中匹配到了子游標,可是須要生成會話遊標it

軟軟解析:會話遊標和共享遊標都不須要從新生成class


v$sql的字段

child_number:sql子游標號,每一個sql_id從0開始

LOADS:產生子游標的次數,即硬解析次數,該值不必定跟v$sql的子游標數量一致,由於子游標可能被回收,清除

EXECUTIONS:執行次數,表示sql執行了幾回

PARSE_CALLS:執行解析的次數,包括硬解析和軟解析

PLAN_HASH_VALUE:執行計劃的hash_value


案例:使用了綁定變量也可能產生硬解析

select * from scott.emp e where e.ename = 'abc'

select * from scott.emp e where e.ename = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'


經測試,若是綁定變量長度差距太大,也可能觸發硬解析,即便禁止變量窺視(_optim_peek_user_binds=false)也不行。

v$sql_shared_cursor,根據sql_id找到硬解析緣由



CURSOR_SHARING

exact:默認,sql語句徹底相同(執行環境都得相同,好比查詢表的數據分佈),如有不一樣,則不會共享遊標

force:強制綁定變量

similar:在oracle認爲某條語句謂詞條件可能會影響他的執行計劃,纔會被從新分析,不然重用sql

相關文章
相關標籤/搜索