共計 2741 個字符,預(yù)計需要花費 7 分鐘才能閱讀完成。
如何進行 Oracle 數(shù)據(jù)庫硬解析、軟解析、軟軟解析聯(lián)系與區(qū)別的分析,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
Oracle 數(shù)據(jù)庫硬解析和軟解析有相同的一步,而軟軟解析與硬解析、軟解析完全不一樣。
一、sql 解析
這里我們先簡單 sql 語句執(zhí)行步驟:
語法檢查(syntax check)
語義檢查(symantic check): 對象是否存在,是否有權(quán)限。
sql 解析(parse): 利用內(nèi)部算法對 sql 進行解析,生成解析樹及執(zhí)行計劃。
執(zhí)行 sql,返回結(jié)果(execute and return)
首先了解一下 sql 解析時用到的內(nèi)存結(jié)構(gòu) mdash; mdash;shared pool。
shared pool 是一塊內(nèi)存池,里邊又被分成了很多小的區(qū)塊,每個塊有他們的作用:
free (空閑)
library cache (庫緩存,緩存 sql 語句以及 sql 所對應(yīng)的執(zhí)行計劃)
row cache (字典緩存 mdash; mdash; 庫里有多少表,多少用戶,多少個列,列的名字,列的數(shù)據(jù)類型,每個表多大等等都屬于數(shù)據(jù)庫自身信息。)
一個 sql 語句,進入到數(shù)據(jù)庫后,server process 會拿著 sql 語句到 shared pool 中的 library cache 里邊去找,看 sql 語句以前是否有執(zhí)行過。也就是在 library cache 里面看有沒有這條 sql 語句以及 sql 語句所對應(yīng)的執(zhí)行計劃。(此過程是通過對傳遞進來的 SQL 語句使用 HASH 函數(shù)運算得出 HASH 值,與共享池中現(xiàn)有語句的 HASH 值進行比較看是否一一對應(yīng)。現(xiàn)有數(shù)據(jù)庫中 SQL 語句的 HASH 值我們可以通過訪問 vsql、vsql、vsqlarea、v$sqltext 等數(shù)據(jù)字典中的 HASH_VALUE 列查詢得出。)
二、涉及解析的概念
1. 硬解析
硬解析 (Hard Parse) 是指 Oracle 在執(zhí)行目標 SQL 時,在庫緩存 (Library Cache) 中找不到可以重用的解析樹和執(zhí)行計劃,而不得不從頭開始解析目標 SQL 并生成相應(yīng)的父游標 (Parent Cursor) 和子游標 (Child Cursor) 的過程。
硬解析實際上有兩種類型:一種是在庫緩存中找不到匹配的父游標(Parent Cursor),此時 Oracle 會從頭開始解析目標 SQL,新生成一個父游標和一個子游標,并把它們掛在對應(yīng)的 HashBucket 中; 另外一種是找到了匹配的父游標但未找到匹配的子游標,此時 Oracle 也會從頭開始解析該目標 SQL,新生成一個子游標,并把這個子游標掛在對應(yīng)的父游標下。
硬解析過程:
語法、語義及權(quán)限檢查;
查詢轉(zhuǎn)換 (通過應(yīng)用各種不同的轉(zhuǎn)換技巧,會生成語義上等同的新的 SQL 語句,如 count(1) 會轉(zhuǎn)為 count(*));
根據(jù)統(tǒng)計信息生成執(zhí)行計劃(找出成本最低的路徑,這一步比較耗時);
將游標信息 (執(zhí)行計劃) 保存到庫緩存。
2. 軟解析
軟解析 (Soft Parse) 是指 Oracle 在執(zhí)行目標 SQL 時,在 Library Cache 中找到了匹配的父游標 (Parent Cursor) 和子游標(Child Cursor),并將存儲在子游標中的解析樹和執(zhí)行計劃直接拿過來重用而無須從頭開始解析的過程。
軟解析過程:
語法、語義及權(quán)限檢查;
將整條 SQL hash 后從庫緩存中執(zhí)行計劃。
軟解析對比硬解析省了三個步驟。
3. 軟軟解析
軟軟解析 (Soft Soft Parse) 是指若參數(shù) SESSION_CACHED_CURSORS 的值大于 0,并且該會話游標所對應(yīng)的目標 SQL 解析和執(zhí)行的次數(shù)超過 3 次,則此時該會話游標會被直接緩存在當(dāng)前會話的 PGA 中的。若該 SQL 再次執(zhí)行的時候,則只需要對其進行語法分析、權(quán)限對象分析之后就可以直接從當(dāng)前會話的 PGA 中將之前緩存的匹配會話游標直接拿過來用就可以了,這就是軟軟解析。
軟軟解析過程:
要完全理解軟軟解析先要理解游標的概念,當(dāng)執(zhí)行 SQL 時,首先要打開游標,執(zhí)行完成后,要關(guān)閉游標,游標可以理解為 SQL 語句的一個句柄。
在執(zhí)行軟軟解析之前,首先要進行軟解析,MOS 上說執(zhí)行 3 次的 SQL 語句會把游標緩存到 PGA,這個游標一直開著,當(dāng)再有相同的 SQL 執(zhí)行時,則跳過解析的所有過程直接去取執(zhí)行計劃。
三、實驗:
1. 環(huán)境準備:
drop table test purge; alter system flush shared_pool; create table test as select * from dba_objects where 1 1; exec dbms_stats.gather_table_stats(ownname = sys ,tabname = test
2. 硬解析
select * from test where object_id=20; select * from test where object_id=30; select * from test where object_id=40; select * from test where object_id=50;
3. 軟解析
var oid number; exec :oid:=20; select * from test where object_id=:oid; exec :oid:=30; select * from test where object_id=:oid; exec :oid:=40; select * from test where object_id=:oid; exec :oid:=50; select * from test where object_id=:oid;
4. 軟軟解析
begin for i in 1..4 loop execute immediate select * from test where object_id=:i using i; end loop; end; /
5. 統(tǒng)計
select sql_text,s.PARSE_CALLS,loads,executions from v$sql s where sql_text like select * from test where object_id% order by 1,2,3,4;
可以看到軟解析與軟軟解析相比,軟軟解析只是解析一次。
字段解釋:
PARSE_CALLS 解析的次數(shù)
LOADS 硬解析的次數(shù)
EXECUTIONS 執(zhí)行的次數(shù)
關(guān)于如何進行 Oracle 數(shù)據(jù)庫硬解析、軟解析、軟軟解析聯(lián)系與區(qū)別的分析問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注丸趣 TV 行業(yè)資訊頻道了解更多相關(guān)知識。