Google Search

自訂搜尋

2009年5月31日 星期日

[SQL Tune] Hard Parse vs. Soft Parse

Parse 是SQL在執行前的一個重要步驟,也是DBA在調整效能時的一個重要參考指標. Parse可以分為Hard-Parse和Soft-Parse,其介紹如下:

- Hard parse
當 SQL執行時,當Oracle發現在shared pool中找不到相同的SQL時,Oracle就會做Hard-Parse的動作. 他包含以下動作:
* 檢查該SQL的語法
* 檢查執行該SQL的相關權限
* 在shared pool中配置memory給該SQL.
* 做查詢轉換(Query Transformation):當有用到Materialized View時做Table的轉換.
* 最佳化(Optimization):就是產生 Execution Plan,這大概是最耗費CPU的動作.
* 產生執行物件(用VB的講法就是執行檔)
由上面的動作可以知道,Hard-Parse是一個昂貴的動作. 所謂昂貴就是只從Latch的使用到CPU時間的耗用等等.

- Soft parse
相較於Hard-Parse,如果該SQL在shared pool中找到相同的SQL時,Oracle就會做Soft-Parse的動作. 它只會包含前述的步驟1-2. 至於何謂相同的SQL?這時就要瞭解何謂Bind Variable?以下兩個SQL對Oracle來說就是不同的SQL.

select * from X1 where A1='1';
select * from X1 where A1='2';

使用Bind Vriable,才可以將兩句SQL的語法統一如下:

select * from X1 where A1=:X;
:X='1'

至於程式是否使用到Bind Variable則端視應用系統的架構而定,本人服務的公司使用的MES系統是3-tier,但是就是中間層,也就是Application Server並未使用Bind Variable,造成DBA在校調系統時碰到很大的困難. 因為整個系統的延展性(Scalable)很差,導因於每個SQL都被Oracle視為不同的SQL,都要做一次編譯,CPU資源的耗費可想而知.

所以Bind Variable雖然是一個簡單的觀念,卻是開發Oracle應用程式時必要的觀念!

Tom有更精闢的解說在!

沒有留言: