oracle 的硬解析和軟解析
提到軟解析(soft parse)和硬解析(hard parse),就不能不說一下oracle 對sql的處理過程。當你發出一條sql 語句交付oracle,在執行和獲取結果前,oracle對此sql 將進行幾個步驟的處理過程:
檢查此sql 的拼寫是否語法。
諸如檢查sql 語句中的訪問物件是否存在及該使用者是否具備相應的許可權。
利用內部演算法對sql 進行解析,生成解析樹(parse tree)及執行計畫(execution plan)。
其中,軟、硬解析就發生在第三個過程裡。
oracle 利用內部的hash 演算法來取得該sql 的hash 值,然後在library cache 裡查詢是否存在該hash 值;假設存在,則將此sql 與cache 中的進行比較;假設「相同」,就將利用已有的解析樹與執行計畫,而省略了優化器的相關工作。這也就是
軟解析的過程。誠然,如果上面的2 個假設中任有乙個不成立,那麼優化器都將進行建立解析樹、生成執行計畫的動作。
這個過程就叫硬解析。
建立解析樹、生成執行計畫對於sql 的執行來說是開銷昂貴的動作,所以,應當極力避免硬解析,盡量使用軟解析。
有如下兩句查詢語句:
1.select * from emp where empno = 123;
2.select * from emp where empno = :emp_no;
1句,查詢員工編號是123的員工資訊,oracle第一次經過分析編譯後執行。但如果下次還要再查詢編號為456和789的員工資訊時,oracle將會再將這句sql分析編譯,然後再執行。
2句,首先定義變數emp_no,我們將123賦給變數,第一次的時候也是經過分析編譯後再執行,但是到了接下來再想查詢其他員工編號的資訊時,oracle會將第一次編譯後的查詢方案(在第一次編譯執行之後已經儲存在共享池中)用來進行下一次的查詢。
**塊一:
alter system flush shared_pool;
set serveroutput on;
set timing on;
declare
type rc is ref cursor;
l_rc rc;
l_dummy all_objects.object_name%type;
l_start number default dbms_utility.get_time;
begin
for i in 1 .. 1000 loop
open l_rc for 'select object_name from all_objects where object_id = '||i;
fetch l_rc into l_dummy;
close l_rc;
end loop;
dbms_output.put_line(round((dbms_utility.get_time-l_start)/100,2)|| 'seconds ...');
end;
/81.62seconds ...
**塊二:
declare
type rc is ref cursor;
l_rc rc;
l_dummy all_objects.object_name%type;
l_start number default dbms_utility.get_time;
begin
for i in 1 .. 1000 loop
open l_rc for 'select object_name from all_objects where object_id = :x' using i;
fetch l_rc into l_dummy;
close l_rc;
end loop;
dbms_output.put_line(round((dbms_utility.get_time-l_start)/100,2)|| 'seconds ...');
end;
/.28seconds ...
在**塊二中使用了變數x,將i的值賦給了x,這樣一來,oracle在執行的時候只需要編譯一次,其他999次都是從共享池中使用查詢方案,查詢速度較**塊一快將近300倍。 Oracle中SQL語句解析的步驟
我們都知道在oracle中每條sql語句在執行之前都需要經過解析,這裡面又分為軟解析和硬解析。那麼這兩種解析有何不同之處呢?它們又分別是如何進行解析呢?oracle內部解析的步驟又是如何進行的呢?下面我們就這些話題進行共同 在oracle中存在兩種型別的sql語句,一類為ddl語句,他們是從來不會共...
SQL基礎語句解析
sql structuredquerylanguage 語句又叫結構化查詢語言,適用於關係型據庫比如mysql,oracle,sqlserver等資料庫.ddl 資料定義語言 用於運算元據庫和表 dml 資料操作語言 用於操作表中的記錄 dql 資料查詢語言 用於查詢表中的記錄 dcl 資料控制語言...
程式設計能力強化(4) 模擬SQL語句解析
這是2010年軟體大賽的樣題,用到的知識點比較多,也比較實用。題目 資料庫中有 表 的概念。表 由若干 行 組成,每 行 由許多 列 組成。一般的資料庫都提供了對 sql的支援。我們可以模擬乙個最簡單版的 sql,只能實現簡單的排序,簡單的選擇條件,列的顯示順序等功能。具體如下 1 輸入help,會...