共計(jì) 1948 個(gè)字符,預(yù)計(jì)需要花費(fèi) 5 分鐘才能閱讀完成。
如何理解 oracle 硬解析、軟解析、軟軟解析,針對這個(gè)問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。
硬解析和軟解析有相同的一步,而軟軟解析與硬解析、軟解析完全不一樣。先來說下理論上的東西,然后來做個(gè)實(shí)驗(yàn)。
硬解析過程:
1. 語法、語義及權(quán)限檢查;
2. 查詢轉(zhuǎn)換(通過應(yīng)用各種不同的轉(zhuǎn)換技巧,會(huì)生成語義上等同的新的 SQL 語句,如 count(1)會(huì)轉(zhuǎn)為 count(*));
3. 根據(jù)統(tǒng)計(jì)信息生成執(zhí)行計(jì)劃(找出成本最低的路徑,這一步比較耗時(shí));
4. 將游標(biāo)信息(執(zhí)行計(jì)劃)保存到庫緩存。
軟解析過程:
1. 語法、語義及權(quán)限檢查;
2. 將整條 SQL hash 后從庫緩存中執(zhí)行計(jì)劃。
軟解析對比硬解析省了三個(gè)步驟。
軟軟解析過程:
要完全理解軟軟解析先要理解游標(biāo)的概念,當(dāng)執(zhí)行 SQL 時(shí),首先要打開游標(biāo),執(zhí)行完成后,要關(guān)閉游標(biāo),游標(biāo)可以理解為 SQL 語句的一個(gè)句柄。
在執(zhí)行軟軟解析之前,首先要進(jìn)行軟解析,MOS 上說執(zhí)行 3 次的 SQL 語句會(huì)把游標(biāo)緩存到 PGA,這個(gè)游標(biāo)一直開著,當(dāng)再有相同的 SQL 執(zhí)行時(shí),則跳過解析的所有過程直接去取執(zhí)行計(jì)劃。
SQL drop table test purge;
SQL alter system flush shared_pool;
SQL create table test as select * from dba_objects where 1 1;
SQL exec dbms_stats.gather_table_stats(user, test
硬解析:
SQL select * from test where object_id=20;
未選定行
SQL select * from test where object_id=30;
未選定行
SQL select * from test where object_id=40;
未選定行
SQL select * from test where object_id=50;
未選定行
軟解析:
SQL var oid number;
SQL exec :oid:=20;
SQL select * from test where object_id=:oid;
未選定行
SQL exec :oid:=30;
SQL select * from test where object_id=:oid;
未選定行
SQL exec :oid:=40;
SQL select * from test where object_id=:oid;
未選定行
SQL exec :oid:=50;
SQL select * from test where object_id=:oid;
未選定行
軟軟解析:
SQL begin
for i in 1..4 loop
execute immediate select * from test where object_id=:i using i;
end loop;
end;
/
SQL col sql_text format a40
SQL 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;
SQL_TEXT PARSE_CALLS LOADS EXECUTIONS
—————————————- ———– ———- ———-
select * from test where object_id=20 1 1 1
select * from test where object_id=30 1 1 1
select * from test where object_id=40 1 1 1
select * from test where object_id=50 1 1 1
select * from test where object_id=:i 1 1 4
select * from test where object_id=:oid 4 1 4
可以看到軟解析與軟軟解析相比,軟軟解析只是解析一次。
字段解釋:
PARSE_CALLS 解析的次數(shù)
LOADS 硬解析的次數(shù)
EXECUTIONS 執(zhí)行的次數(shù)
SQL 執(zhí)行過程圖如下:
關(guān)于如何理解 oracle 硬解析、軟解析、軟軟解析問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注丸趣 TV 行業(yè)資訊頻道了解更多相關(guān)知識。