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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JavaScript function 函式JavaScriptFunction函式
- js的函式function(一)JS函式Function
- Java 8 Function 函式介面JavaFunction函式
- test函式中的區域性變數函式變數
- JavaScript中的函式過載(Function overloading)JavaScript函式Function
- PyTorch:損失函式loss functionPyTorch函式Function
- Function(函式分享)第二節Function函式
- 高階函式 - Higher Order Function函式Function
- JavaScript入門-函式function(二)JavaScript函式Function
- 十二、變數作用域:區域性變數、全域性變數,函式版名片管理系統—新增函式文件變數函式
- 平凡的函式 線性篩積性函式函式
- js函式和變數的執行順序【易錯】JS函式變數
- 實現call函式,手寫Function.prototype.call函式函式Function
- ThinkPHP函式提示錯誤function undefined的方法PHP函式FunctionUndefined
- postgresql pg_xlog_location_diff 函式SQL函式
- mysql儲存過程procedure、函式function的用法MySql儲存過程函式Function
- java8 函式式介面——Function/Predict/Supplier/ConsumerJava函式Function
- PostgreSQLOracle相容性之-PL/SQLDETERMINISTIC與PG函式穩定性(immutable,stable,volatile)SQLOracle函式
- 函式外與函式內的變數函式變數
- ES6 箭頭函式(arrow function)函式Function
- Python進階 函式快取 (Function caching)Python函式快取Function
- JavaScript 高階函式(Heigher-order function)JavaScript函式Function
- PG wal日誌LSN相關函式函式
- 邏輯迴歸損失函式(cost function)邏輯迴歸函式Function
- Solidity之旅(十三)函式及其可見性和狀態可變性Solid函式
- 函式之定義及全域性變數&區域性變數&風溼理論函式變數
- 【譯】節選--揭祕命名函式表示式(Named function expressions )函式FunctionExpress
- 【譯】節選–揭祕命名函式表示式(Named function expressions )函式FunctionExpress
- Google Cloud Function函式訪問AWS的Redis服務(二)GoCloudFunction函式Redis
- PostgreSQL 原始碼解讀(149)- PG Tools#1(pg_basebackup主函式)SQL原始碼函式
- ES6標準 Arrow Function(箭頭函式=>)Function函式
- 密碼學系列之:海綿函式sponge function密碼學函式Function
- JS function 是函式也是物件, 淺談原型鏈JSFunction函式物件原型
- JavaScript函式的反應性JavaScript函式
- 【複變函式與積分變換】02. 解析函式函式
- Volatility FAQ
- 深入探討Function Calling:實現外部函式呼叫的工作原理Function函式
- 關於使用toFixed()函式時報錯”toFixed() is not a function”的問題函式Function
- Java 8 中需要知道的4個函式式介面-Function、Consumer、Supplier、PredicateJava函式Function