ORACLE 4 SQL語句解析

2021-07-11 10:00:41 字數 2163 閱讀 5147

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,會...