Oracle的硬解析和軟解析
提到軟解析(soft parse)和硬解析(hard parse),就不能不說一下Oracle對SQL的處理過程.當你發出一條SQL語句交付給Oracle,在執行和獲取結果前,Oracle對此SQL進行幾個步驟的處理過程。
1.語法檢查(syntax check)
檢查此sql的拼寫是否是否符合語法要求.
2. 語義檢查(semantic check)
諸如檢查sql語句的訪問物件是否存在及使用者是否具備相應的許可權.
3.對sql語句進行解析(parse)
利用內部演算法對sql進行解析,生成解析樹(parse tree)及執行計劃(execution plan).
4.執行sql,返回結果(execute and return)
其中,軟,硬解析就發生在第三個過程裡.
Oracle利用內部的hash演算法來取得該sql的hash值,然後在library cache裡查詢是否存在該hash值;
假設存在,則將此sql與cache中的進行比較;
假設“相同”,則將利用已有的解析樹與執行計劃,而省略了最佳化器的相關工作。這也是軟解析的過程。
誠然,如果上面的2個假設有一個不成立,那麼最佳化器將進行建立解析樹,生成執行計劃的動作.這個過程就叫硬解析.
在sql中應該儘量避免硬解析,下面為使用非繫結變數和繫結變數的情況:
--建立測試表
create table test
(
id1 number,
id2 number
);
--查詢存在的 parse count (解析數)
select name, value from v$mystat a , v$statname b
where a.STATISTIC#=b.STATISTIC#
and name like 'parse count%';
NAME VALUE
1 parse count (total) 56
2 parse count (hard) 7
3 parse count (failures) 0
--(硬解析)
begin
for i in 1..10000 loop
execute immediate 'insert into test values (' ||i||','||i|| ') ' ;
end loop;
commit;
end;
--已用時間: 00: 00: 05.08
--查詢執行sql後的 parse count (解析數)
select name, value from v$mystat a, v$statname b
where a.STATISTIC#=b.STATISTIC#
and name like 'parse count%';
NAME VALUE
---------------------------------------------------------------- ----------
parse count (total) 10064
parse count (hard) 10011 硬解析次數為 10011-7
parse count (failures) 0
-- 查詢shared_pool的關於執行insert into test語句的cache
select s.SQL_TEXT,s.VERSION_COUNT,s.PARSE_CALLS, s.EXECUTIONS
from v$sqlarea s where s.SQL_TEXT like '%test%';
--alter system flush shared_pool; 清空共享池
********************************************************************
--使用繫結變數的情況
--查詢存在的 parse count (解析數)
select name, value from v$mystat a , v$statname b
where a.STATISTIC#=b.STATISTIC#
and name like 'parse count%';
NAME VALUE
---------------------------------------------------------------- ----------
parse count (total) 171
parse count (hard) 36
parse count (failures) 0
--(軟解析)
begin
for i in 1..10000 loop
execute immediate 'insert into test values (:v1,:v2) ' using i, i ;
end loop;
commit;
end;
--已用時間: 00: 00: 01.01 (硬解析為5秒多)
-查詢執行迴圈插入所生成的parse count (解析數)
select name, value from v$mystat a, v$statname b
where a.STATISTIC#=b.STATISTIC#
and name like 'parse count%';
NAME VALUE
---------------------------------------------------------------- ----------
parse count (total) 10206
parse count (hard) 46 (硬解析46次)
parse count (failures) 0
-- 查詢shared_pool的關於執行insert into test語句的cache
select s.SQL_TEXT,s.VERSION_COUNT,s.PARSE_CALLS, s.EXECUTIONS
from v$sqlarea s where s.SQL_TEXT like '%test%';
--查詢結果
insert into test values (:v1,:v2)共執行了10000次軟解析。
共執行10206-171 >1000次,原因是還包括其他一些系統表的讀寫。
http://jj2001hh.blog.163.com/blog/static/615781482008017104824467/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21601207/viewspace-680719/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE 硬解析和軟解析 軟軟解析Oracle
- Oracle SQL的硬解析和軟解析OracleSQL
- ORACLE SQL解析之硬解析和軟解析OracleSQL
- 軟解析和硬解析
- Oracle 硬解析與軟解析Oracle
- Oracle的軟解析(soft prase)和硬解析(hard prase)Oracle
- 徹底弄懂oracle硬解析、軟解析、軟軟解析Oracle
- Oracle中的遊標、硬解析、軟解析、軟軟解析、解析失敗Oracle
- oracle實驗記錄 (分析oracle硬解析&軟解析&fast soft parse)OracleAST
- oracle實驗記錄 (分析oracle硬解析&軟解析&fast soft parse(2))OracleAST
- 草稿 - 遊標,硬解析,軟解析 等
- soft parse(軟解析),hard parse(硬解析)
- 軟解析、硬解析的一個小測試
- 硬解析和物理讀取與軟解析和邏輯讀取
- Oracle - 共享遊標、父子游標、硬軟解析Oracle
- 在oracle 10.2.0.5分析硬解析及軟解析及軟軟解析獲取shared pool latch機制系列五Oracle
- ORACLE的軟 軟 軟 解析!Oracle
- SQL大致流程、SPM、軟軟、軟、硬解析SQL
- 共享池之八:軟解析、硬解析、軟軟解析 詳解一條SQL在library cache中解析涉及的鎖SQL
- 硬解析物理讀VS軟解析邏輯讀 測試
- 【體系結構】sql語句解析過程小實驗 軟解析、硬解析SQL
- 父遊標 子游標和軟硬解析記載-02
- grant 操作硬解析
- ORACLE未繫結變數和硬解析過多問題處理Oracle變數
- 關於軟解析(soft parse)與硬解析(hard parse),以及session cached cursors (asktom)Session
- 查詢 分析硬解析較高的sql,SQL
- DOM解析和SAX解析
- dom解析和sax解析的區別
- 硬解析帶來高CPU消耗的診斷
- 13_共享SQL減少硬解析SQL
- Oracle引數檔案解析——引數解析Oracle
- 深入解析和定製Oracle優化工具Oracle優化
- Checkpoint和SCN的解析
- 深入解析Laravel的中介軟體Laravel
- Oracle 出錯解析Oracle
- DNS遞迴解析和迭代解析的區別-VeCloudDNS遞迴Cloud
- 遊標引數shared_cached_cursors和軟軟解析
- Shared pool的library cache lock/pin及硬解析