1. 程式人生 > >靜態SQL與動態SQL的比較

靜態SQL與動態SQL的比較

               

靜態SQL與動態SQL相比具備很多優點,最主要的表現在兩個方面:

1、 靜態SQL指定具體的物件,可以避免動態SQL中隱含的錯誤

2、 靜態SQL的分析和執行速度比動態SQL要快

所以,如果使用靜態SQL可以達到目的,我們推薦用靜態SQL替代動態SQL,即使需要多編寫一些程式碼也是值得的。那麼,在開發程式程式碼的時候,如何判定一段SQL程式碼究竟該採用動態SQL,還是該採用靜態SQL呢?簡單總結以下幾個原則,供大家參考:

1、尋找消除動態SQL的機會

一般而言,想採用動態SQL實現的語句中都有不確定的因素,如果所有資訊都確定,沒有理由採用動態SQL來實現,SQL語句的不確定因素包括:SQL選擇的欄位列名不確定,選擇的From表名不確定,以及Where條件中的條件欄位名不確定等情況,可採用Decode, Case,以及IF ELSE來分情況寫成靜態SQL。

舉例:

Execute immediate

‘select ‘|| p_name||’ from app_main where eff_date>sysdate-1’ into v_value;

如果這個欄位的取值為有限的幾個值,則可以寫成以下靜態SQL:

Select decode(p_name,’ a’, a,

‘b’, b,

‘c’, c,

‘c_DATE’,to_char(c_DATE,’yyyymmdd’)) into v_value from tab_name;

2、在程式碼長短以及SQL語句的執行頻率上折中考慮

如果一段SQL程式碼的Where條件非常複雜,SQL語句本身也很長,甚至關聯到很多大表(這是我們經常遇到的情況),按照IF ELSE的方式寫成靜態SQL的話,整個程式的程式碼就會非常長,因此開發人員更偏向於使用動態SQL。在這種情況下,就需要考慮到程式碼的執行頻率,以及SQL語句在不同情況下的執行計劃,如果執行頻率較高,且各種情況執行計劃間的區別很大,則改寫成靜態SQL更加合理;對於寫成靜態SQL程式碼異常長的情況,我們可以將執行頻率高的主要SQL寫成靜態SQL,其他情況分類寫成動態SQL。這樣做,有利於我們按照不同的情況,固定執行計劃(前段時間發生過一個事件,在動態SQL中固定執行計劃,造成一種情況效率改善,另一種情況效率明顯降低)。

3、無法用靜態SQL或執行頻率較低的簡單SQL可採用動態SQL實現

有些情況下,沒有辦法確定SQL語句中欄位列名或者表名,也沒有辦法確定這些可變因素的個數,則只能採用動態SQL來實現。再就是一次性執行的指令碼,或者執行次數少的SQL也可以寫成動態SQL(能加上繫結變數更好),這時效能問題不大,程式程式碼也顯得簡潔。

舉例:

傳入引數是sequence的名字,按照這個名字獲取序列值,這時採用動態SQL可以靈活的執行語句,不必每增加一個seuence就增加一個語句。再就是要truncate table(根據傳入進來的table名字執行truncate,這個我們用的比較多)。

IF condition THEN

--code

ELSIF condition THEN

--code

else

--code

END IF;

CASE
WHEN condition1 THEN value1;

WHEN condition2 THEN value2;
WHEN condition3 THEN value3;
ELSE value4;
END CASE

           

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://blog.csdn.net/jiangjunshow