天天看點

PostgreSQL Oracle 相容性之 - PL/SQL DETERMINISTIC 與PG函數穩定性(immutable, stable, volatile)

标簽

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函數或操作符,可以用于建立表達式索引。

等。

詳細介紹見末尾文檔。

https://github.com/digoal/blog/blob/master/201804/20180410_01.md#%E5%8F%82%E8%80%83 參考

https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_5009.htm http://www.dba-oracle.com/plsql/t_plsql_deterministic.htm 《PostgreSQL 函數穩定性與constraint_excluded分區表邏輯推理過濾的CASE》 《函數穩定性講解 - retalk PostgreSQL function's [ volatile|stable|immutable ]》 《函數穩定性講解 - 函數索引思考, pay attention to function index used in PostgreSQL》 《函數穩定性講解 - Thinking PostgreSQL Function's Volatility Categories》