标簽
PostgreSQL , Oracle , 函數穩定性 , stable , immutable , volatile , DETERMINISTIC
https://github.com/digoal/blog/blob/master/201804/20180410_01.md#%E8%83%8C%E6%99%AF 背景
Oracle建立pl/sql函數時,有一個參數DETERMINISTIC,含義時隻要輸入的參數一樣,傳回的結果一定一樣。
DETERMINISTIC Clause
Specify DETERMINISTIC to indicate that the function returns
the same result value whenever it is called with the same values for its arguments.
CREATE OR REPLACE FUNCTION text_length(a CLOB)
RETURN NUMBER DETERMINISTIC IS
BEGIN
RETURN DBMS_LOB.GETLENGTH(a);
END;
https://github.com/digoal/blog/blob/master/201804/20180410_01.md#%E5%9C%A8postgresql%E4%B8%AD%E7%A7%B0%E4%B9%8B%E4%B8%BA%E5%87%BD%E6%95%B0%E7%9A%84%E7%A8%B3%E5%AE%9A%E6%80%A7%E5%8F%82%E6%95%B0 在PostgreSQL中,稱之為函數的穩定性參數
在PG中,函數穩定性分為三檔:
immutable,超級穩定,任何時候調用,隻要函數的參數不變結果就不變。如果參數為常量或者無參數,在生成執行計劃時,直接将這類函數替換為常量。
stable,穩定,在一個事務中調用時,隻要函數的參數不變結果就不變。
volatile,不穩定。
函數的穩定性會影響資料庫的一些行為:
1、綁定變量,immutable函數(包含常量參數或不包含參數時)計算一次。stable函數每次bind的時候要重算。
2、生成執行計劃,stable, immutable函數作為WHERE條件時,可以被用于索引AM。(即允許采用索引優化)
3、排除分區表不需要通路的分區,stable, immutable函數作為WHERE條件時,可用于過濾不需要通路的子表。
4、是否可用于建立索引,隻有immutable函數或操作符,可以用于建立表達式索引。
等。
詳細介紹見末尾文檔。