如何進(jìn)行Oracle數(shù)據(jù)庫硬解析、軟解析、軟軟解析聯(lián)系與區(qū)別的分析,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
十余年的平遠(yuǎn)網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。網(wǎng)絡(luò)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整平遠(yuǎn)建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“平遠(yuǎn)網(wǎng)站設(shè)計”,“平遠(yuǎn)網(wǎng)站推廣”以來,每個客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
Oracle數(shù)據(jù)庫硬解析和軟解析有相同的一步,而軟軟解析與硬解析、軟解析完全不一樣。
一、sql解析
這里我們先簡單sql語句執(zhí)行步驟:
語法檢查(syntax check)
語義檢查(symantic check): 對象是否存在,是否有權(quán)限。
sql解析(parse): 利用內(nèi)部算法對sql進(jìn)行解析,生成解析樹及執(zhí)行計劃。
執(zhí)行sql,返回結(jié)果(execute and return)
首先了解一下sql解析時用到的內(nèi)存結(jié)構(gòu)——shared pool。
shared pool是一塊內(nèi)存池,里邊又被分成了很多小的區(qū)塊,每個塊有他們的作用:
free (空閑)
library cache (庫緩存,緩存sql語句以及sql所對應(yīng)的執(zhí)行計劃)
row cache (字典緩存——庫里有多少表,多少用戶,多少個列,列的名字,列的數(shù)據(jù)類型,每個表多大等等都屬于數(shù)據(jù)庫自身信息。)
一個sql 語句,進(jìn)入到數(shù)據(jù)庫后,server process 會拿著sql語句到shared pool中的library cache 里邊去找,看sql語句以前是否有執(zhí)行過。也就是在library cache 里面看有沒有這條sql語句以及sql語句所對應(yīng)的執(zhí)行計劃。(此過程是通過對傳遞進(jìn)來的SQL語句使用HASH函數(shù)運(yùn)算得出HASH值,與共享池中現(xiàn)有語句的HASH值進(jìn)行比較看是否一一對應(yīng)?,F(xiàn)有數(shù)據(jù)庫中SQL語句的HASH值我們可以通過訪問vsql、vsql、vsqlarea、v$sqltext等數(shù)據(jù)字典中的HASH_VALUE列查詢得出。)
二、涉及解析的概念
1. 硬解析
硬解析(Hard Parse)是指Oracle在執(zhí)行目標(biāo)SQL時,在庫緩存(Library Cache)中找不到可以重用的解析樹和執(zhí)行計劃,而不得不從頭開始解析目標(biāo)SQL并生成相應(yīng)的父游標(biāo)(Parent Cursor)和子游標(biāo)(Child Cursor)的過程。
硬解析實(shí)際上有兩種類型:一種是在庫緩存中找不到匹配的父游標(biāo)(Parent Cursor),此時Oracle會從頭開始解析目標(biāo)SQL,新生成一個父游標(biāo)和一個子游標(biāo),并把它們掛在對應(yīng)的HashBucket中;另外一種是找到了匹配的父游標(biāo)但未找到匹配的子游標(biāo),此時Oracle也會從頭開始解析該目標(biāo)SQL,新生成一個子游標(biāo),并把這個子游標(biāo)掛在對應(yīng)的父游標(biāo)下。
硬解析過程:
語法、語義及權(quán)限檢查;
查詢轉(zhuǎn)換(通過應(yīng)用各種不同的轉(zhuǎn)換技巧,會生成語義上等同的新的SQL語句,如count(1)會轉(zhuǎn)為count(*));
根據(jù)統(tǒng)計信息生成執(zhí)行計劃(找出成本最低的路徑,這一步比較耗時);
將游標(biāo)信息(執(zhí)行計劃)保存到庫緩存。
2. 軟解析
軟解析(Soft Parse)是指Oracle在執(zhí)行目標(biāo)SQL時,在Library Cache中找到了匹配的父游標(biāo)(Parent Cursor)和子游標(biāo)(Child Cursor),并將存儲在子游標(biāo)中的解析樹和執(zhí)行計劃直接拿過來重用而無須從頭開始解析的過程。
軟解析過程:
語法、語義及權(quán)限檢查;
將整條SQL hash后從庫緩存中執(zhí)行計劃。
軟解析對比硬解析省了三個步驟。
3. 軟軟解析
軟軟解析(Soft Soft Parse)是指若參數(shù)SESSION_CACHED_CURSORS的值大于0,并且該會話游標(biāo)所對應(yīng)的目標(biāo)SQL解析和執(zhí)行的次數(shù)超過3次,則此時該會話游標(biāo)會被直接緩存在當(dāng)前會話的PGA中的。若該SQL再次執(zhí)行的時候,則只需要對其進(jìn)行語法分析、權(quán)限對象分析之后就可以直接從當(dāng)前會話的PGA中將之前緩存的匹配會話游標(biāo)直接拿過來用就可以了,這就是軟軟解析。
軟軟解析過程:
要完全理解軟軟解析先要理解游標(biāo)的概念,當(dāng)執(zhí)行SQL時,首先要打開游標(biāo),執(zhí)行完成后,要關(guān)閉游標(biāo),游標(biāo)可以理解為SQL語句的一個句柄。
在執(zhí)行軟軟解析之前,首先要進(jìn)行軟解析,MOS上說執(zhí)行3次的SQL語句會把游標(biāo)緩存到PGA,這個游標(biāo)一直開著,當(dāng)再有相同的SQL執(zhí)行時,則跳過解析的所有過程直接去取執(zhí)行計劃。
三、實(shí)驗(yàn):
1. 環(huán)境準(zhǔ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)于如何進(jìn)行Oracle數(shù)據(jù)庫硬解析、軟解析、軟軟解析聯(lián)系與區(qū)別的分析問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。