哪種方法更好,爲什麼?在PL/SQL中選擇語句或函數?哪種方法更好,爲什麼?在PL/SQL中選擇語句或函數?
我遇到過一些關於PL/SQL的文章,提到select語句應該被函數替換。 這是否真的提高了性能?
哪種方法更好,爲什麼?在PL/SQL中選擇語句或函數?哪種方法更好,爲什麼?在PL/SQL中選擇語句或函數?
我遇到過一些關於PL/SQL的文章,提到select語句應該被函數替換。 這是否真的提高了性能?
在編寫PL/SQL時,對select語句的每次調用都是上下文切換。上下文切換很昂貴,這就是爲什麼PL/SQL具有全部語句和其他結構,這些結構允許您在不調用SQL的情況下執行PL/SQL。當您從對象檢索數據時使用SQL,當您不需要從表中獲取時使用PL/SQL。
例如
使用
l_val := trim(l_val);
而不是
select trim(l_val) into l_val from dual;
都得到相同的答案,但是第一個比第二便宜得多。
最大限度地減少上下文切換將會使你的代碼更高效:
不好:
For eachrec in (select a, b from table1) loop
update table2 set c = eachrec.a where d = eachrec.b;
end loop;
更好:
update table2 set c = (select a from table1 where d = b)
where exists(select null from table1 where d = b);
第二種方法比較好,因爲只有一個單一上下文切換,而比正在更新的每個記錄的上下文切換。
有人可以幫助我的更新聲明?我知道有一種不用做「選擇」就可以編寫它的方法。我們的數據庫來自不相信主鍵的供應商,所以我從來沒有養成在連接上使用更新的習慣。
更好的方法是使用MERGE語句。 https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm –
通常,更喜歡SQL。 SQL可以跨數據庫移植。 Pl/SQL僅適用於Oracle,因此它不可移植。出於這個原因,我認爲存儲過程是技術債務。
因此,你可能認爲在相同的光照下使用Oracle特定功能的SQL? – APC
Select語句替換在哪裏?在應用程序代碼? – GurV
是的,無論使用哪個選擇查詢,都可以調用一個函數。該函數執行該查詢並返回結果數據。這可能在函數,過程或包中。 – AdityaK
可能是因爲SQL存儲在程序中,並且它的執行計劃被預先計算和緩存......對於直接SQL可能不會發生。 – GurV