PG 函式的易變性(Function Volatility Categories)
pg 函式的valatility 有3個屬性:
1) volatile : 這種型別的函式可以做任何事情,包括修改資料庫,在對同一個引數連續多次呼叫,返回的只值可能是不一樣的。
pg的最佳化器不會對這類函式做任何假設,對於資料庫裡的每一行都針對這個函式重新計算。
2) stable : 這種型別的函式不能修改資料庫,在同一個語句返回的所有的行中,相同的引數對應的返回值是相同的。
pg最佳化器可以針對這類函式做最佳化,對於該函式的多次求值,轉化為只求值一次。 實際上,如果表示式中包含了這類函式,.
是可以利用到索引掃描。這其實就可以顛覆我們在oracle 或者mysql 上的認識,函式列上的計算不能走索引。
3) IMMUTABLE : 這種型別的函式,認為對相同引數的返回值永遠都一樣的。
pg最佳化器可以對這類函式針對常量的引數預先求職。例如select * from tab where x=2+2 ; 可以計算為 where =4;
對於有副作用的函式必須申明為volatile 。 這類函式是無法最佳化的,如果把實際上stable 型別的函式,宣告為volatile ,他的行為也會改變。
一個特例是 current_timestamp 族的函式,這類函式在同一個事務裡返回的值是一樣的,這裡函式是stable 型別的。
stable 與 IMMUTABLE 型別的函式在大部分情況向,可以認為是有相同的行為,在命令列單句執行的sql中,這兩類函式的行為是一致的,
如果在預編譯(prepared-statment)語句中,是不一樣的。 在子查詢中,如果cache 了執行計劃, 對於immutable 型別的函式可能會返回錯誤的結果。
另一個問題,3種型別的函式的資料可見性問題:
volatile 型別的函式,在每次執行的時候,都會重新整理當前的資料檢視(mvcc)
stable 與immutable 型別的行數,在語句開始執行的時候,就建立了資料快照,直到執行結束。
volatile 型別的函式是不能做為函式索引的表示式的,stable 型別的可以。
如果函式里的語句都是select 類的查詢語句,函式宣告為那種型別一般是沒有什麼影響的。這個情況我們應該儘可能的宣告為stable 型別。
immutable 型別的函式,儘量不要宣告。
1) volatile : 這種型別的函式可以做任何事情,包括修改資料庫,在對同一個引數連續多次呼叫,返回的只值可能是不一樣的。
pg的最佳化器不會對這類函式做任何假設,對於資料庫裡的每一行都針對這個函式重新計算。
2) stable : 這種型別的函式不能修改資料庫,在同一個語句返回的所有的行中,相同的引數對應的返回值是相同的。
pg最佳化器可以針對這類函式做最佳化,對於該函式的多次求值,轉化為只求值一次。 實際上,如果表示式中包含了這類函式,.
是可以利用到索引掃描。這其實就可以顛覆我們在oracle 或者mysql 上的認識,函式列上的計算不能走索引。
3) IMMUTABLE : 這種型別的函式,認為對相同引數的返回值永遠都一樣的。
pg最佳化器可以對這類函式針對常量的引數預先求職。例如select * from tab where x=2+2 ; 可以計算為 where =4;
對於有副作用的函式必須申明為volatile 。 這類函式是無法最佳化的,如果把實際上stable 型別的函式,宣告為volatile ,他的行為也會改變。
一個特例是 current_timestamp 族的函式,這類函式在同一個事務裡返回的值是一樣的,這裡函式是stable 型別的。
stable 與 IMMUTABLE 型別的函式在大部分情況向,可以認為是有相同的行為,在命令列單句執行的sql中,這兩類函式的行為是一致的,
如果在預編譯(prepared-statment)語句中,是不一樣的。 在子查詢中,如果cache 了執行計劃, 對於immutable 型別的函式可能會返回錯誤的結果。
另一個問題,3種型別的函式的資料可見性問題:
volatile 型別的函式,在每次執行的時候,都會重新整理當前的資料檢視(mvcc)
stable 與immutable 型別的行數,在語句開始執行的時候,就建立了資料快照,直到執行結束。
volatile 型別的函式是不能做為函式索引的表示式的,stable 型別的可以。
如果函式里的語句都是select 類的查詢語句,函式宣告為那種型別一般是沒有什麼影響的。這個情況我們應該儘可能的宣告為stable 型別。
immutable 型別的函式,儘量不要宣告。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/133735/viewspace-747843/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 函式(FUNCTION)函式Function
- JavaScript function 函式JavaScriptFunction函式
- js的函式function(一)JS函式Function
- pg的function的編寫Function
- PG extract 函式示例函式
- 在JS中一個function函式要呼叫另一個函式裡的變數。JSFunction函式變數
- oracle function函式castOracleFunction函式AST
- JS:1.3,函式(function)JS函式Function
- test函式中的區域性變數函式變數
- SAP 的CALL FUNCTION 函式彙總Function函式
- Java 8 Function 函式介面JavaFunction函式
- javascript Function()建構函式JavaScriptFunction函式
- PL/SQL 06 函式 functionSQL函式Function
- deterministic function 函式索引Function函式索引
- SQL 自定義函式FUNCTIONSQL函式Function
- js函式和變數的執行順序【易錯】JS函式變數
- 十二、變數作用域:區域性變數、全域性變數,函式版名片管理系統—新增函式文件變數函式
- PHP函式register_shutdown_function的用法PHP函式Function
- JavaScript自執行函式(function(){})()的理解JavaScript函式Function
- JavaScript入門-函式function(二)JavaScript函式Function
- Function(函式分享)第二節Function函式
- pipeline function管道函式Function函式
- JavaScript Function 函式深入總結JavaScriptFunction函式
- 平凡的函式 線性篩積性函式函式
- CategoriesGo
- 掃描易的api函式API函式
- 實現call函式,手寫Function.prototype.call函式函式Function
- ThinkPHP函式提示錯誤function undefined的方法PHP函式FunctionUndefined
- C++中的虛擬函式(virtual function)C++函式Function
- javascript的函式的引數是區域性變數JavaScript函式變數
- PyTorch:損失函式loss functionPyTorch函式Function
- IIFE (Imdiately Invoked Function Expression 立即執行的函式表示式)FunctionExpress函式
- postgresql pg_xlog_location_diff 函式SQL函式
- PG wal日誌LSN相關函式函式
- 函式外與函式內的變數函式變數
- 函式不能返回區域性指標變數函式指標變數
- JavaScript中的函式過載(Function overloading)JavaScript函式Function
- mysql儲存過程procedure、函式function的用法MySql儲存過程函式Function