PostgreSQLOracle相容性之-PL/SQLDETERMINISTIC與PG函式穩定性(immutable,stable,volatile)

德哥發表於2018-05-06

標籤

PostgreSQL , Oracle , 函式穩定性 , stable , immutable , volatile , DETERMINISTIC


背景

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;  

在PostgreSQL中,稱之為函式的穩定性引數

在PG中,函式穩定性分為三檔:

immutable,超級穩定,任何時候呼叫,只要函式的引數不變結果就不變。如果引數為常量或者無引數,在生成執行計劃時,直接將這類函式替換為常量。

stable,穩定,在一個事務中呼叫時,只要函式的引數不變結果就不變。

volatile,不穩定。

函式的穩定性會影響資料庫的一些行為:

1、繫結變數,immutable函式(包含常量引數或不包含引數時)計算一次。stable函式每次bind的時候要重算。

2、生成執行計劃,stable, immutable函式作為WHERE條件時,可以被用於索引AM。(即允許採用索引優化)

3、排除分割槽表不需要訪問的分割槽,stable, immutable函式作為WHERE條件時,可用於過濾不需要訪問的子表。

4、是否可用於建立索引,只有immutable函式或操作符,可以用於建立表示式索引。

等。

詳細介紹見末尾文件。

參考

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》


相關文章