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

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

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


在v$sql中一個sql_id會存在多條語句,實際上v$sql中sql_id和child_number共同確定一個唯一的sql,原因是一個sql_id對應多個子遊標。

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

  2. 由於統計信息或者變量窺視,導致執行計劃變化


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


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


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

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

軟軟解析:會話遊標和共享遊標都不需要重新生成


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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章