雖然Oracle提供的DETERMINISTIC聲明,本意是確保函數的確定性,但是如何合理利用,是可以用來提高效能的。
這一篇描述參數順序對效能的影響。
上一篇文章提到了,如果希望通過DETERMINISTIC來擷取效能收益,那麼採用批量方式是必須的,而且數組的值相對而言越大對於效能的協助會越大。
但是這裡存在一個問題,如果需要處理的資料量本身很大,雖然重複的輸入參數不少,但是總的參數不同的值更多,那麼即使將ARRAY的值設定到1000,能帶來的效能收益也很有限,因為即使1000次調用,也不能保證參數完全一樣出現多次,而如果無限制的增大ARRAY,雖然從DETERMINISTIC函數的角度講可以提高效能,但是對於記憶體的佔用等其他方面,會帶來效能的下降,顯然一味的擴大批量並不是問題的解決之道。
其實解決這個問題很簡單,就是在調用DETERMINISTIC函數之前,對函數的參數進行排序,確保相同的參數順序調用,這樣DETERMINISTIC函數執行的次數最少。
繼續使用上一篇文章的例子,看看排序後DETERMINISTIC函數的調用次數:
SQL> UPDATE T_DETER SET C = 1;
已更新15行。
經過時間: 00: 00: 00.17
SQL> SELECT ID, F_DETER(C), F_SYSDATE FROM T_DETER;
ID F_DETER(C) F_SYSDATE
---------- ---------- -------------------
1 1 2011-05-26 14:26:12
2 1 2011-05-26 14:26:13
3 1 2011-05-26 14:26:13
4 1 2011-05-26 14:26:13
5 1 2011-05-26 14:26:13
6 1 2011-05-26 14:26:13
7 1 2011-05-26 14:26:13
8 1 2011-05-26 14:26:13
9 1 2011-05-26 14:26:13
10 1 2011-05-26 14:26:13
11 1 2011-05-26 14:26:13
12 1 2011-05-26 14:26:13
13 1 2011-05-26 14:26:13
14 1 2011-05-26 14:26:13
15 1 2011-05-26 14:26:13
已選擇15行。
1
1
經過時間: 00: 00: 02.29
SQL> SELECT ID, F_DETER(C), F_SYSDATE FROM (SELECT * FROM T_DETER ORDER BY C);
ID F_DETER(C) F_SYSDATE
---------- ---------- -------------------
1 1 2011-05-26 14:26:35
15 1 2011-05-26 14:26:35
3 1 2011-05-26 14:26:35
4 1 2011-05-26 14:26:35
5 1 2011-05-26 14:26:35
6 1 2011-05-26 14:26:35
7 1 2011-05-26 14:26:35
8 1 2011-05-26 14:26:35
9 1 2011-05-26 14:26:35
10 1 2011-05-26 14:26:35
11 1 2011-05-26 14:26:35
12 1 2011-05-26 14:26:35
13 1 2011-05-26 14:26:35
14 1 2011-05-26 14:26:35
2 1 2011-05-26 14:26:35
已選擇15行。
1
經過時間: 00: 00: 01.10
可以看到,由於執行了排序,DETERMINISTIC函數不用再次檢查輸入參數是否相等,因此在SQL運行期間只調用了一次:
SQL> SHOW ARRAY
arraysize 15
SQL> SET ARRAY 1
SQL> SELECT ID, F_DETER(C), F_SYSDATE FROM (SELECT * FROM T_DETER ORDER BY C);
ID F_DETER(C) F_SYSDATE
返回欄目頁:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/