PG 函数的易变性(Function Volatility Categories)
此概念的接触是在做分区表的时候碰到的,分区表按时间字段分区,在查询时当where条件中时间为now()或者current_time()等时是无法查询的,即使进行格式转换也不行,只有是时间格式如‘2015-12-12’才能查询,在请教过以后说是函数形态的问题。搜索一篇文章介绍:
转自:http://blog.itpub.net/133735/viewspace-747843/
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 类型的函数,尽量不要声明。
PG 函数的易变性(Function Volatility Categories)的更多相关文章
- typedef 函数指针 数组 std::function
1.整型指针 typedef int* PINT;或typedef int *PINT; 2.结构体 typedef struct { double data;}DATA, *PDATA; //D ...
- 一个不错的PHP二维数组排序函数简单易用存用
一个不错的PHP二维数组排序函数简单易用存用 传入数组,传入排序的键,传入排序顺序 public function array_sort($arr,$keys,$type='asc') { $keys ...
- Java并发编程(六)原子性与易变性
原子性 原子是最小单元.不可再分的意思.原子性是指某个操作在获取CPU时间时,要么就给它足够时间,让这个操作执行完,要么就不执行这个操作,执行时不能出现上下文切换(把CPU时间从一个线程分配到另一个线 ...
- JavaScript 函数声明与函数表达式的区别 函数声明提升(function declaration hoisting)
解析器在向执行环境中加载数据时,对函数声明和函数表达式并非一视同仁.解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问).至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真的被 ...
- 高阶函数之函数柯里化function currying
var cost = (function(){ var args = []; return function(){ if(arguments.length === 0){ ...
- 样条函数(spline function)—— 分段多项式函数(piecewise polynomial function)
1. 分段多项式函数 样条函数是某种意义上的分段函数. Spline (mathematics) - Wikipedia 最简单的样条函数是一种分段多项式函数(piecewise polynomial ...
- java 并发原子性与易变性 来自thinking in java4 21.3.3
java 并发原子性与易变性 具体介绍请參阅thinking in java4 21.3.3 thinking in java 4免费下载:http://download.csdn.net/deta ...
- php自定义排序数组usort和uasort(uasort保持索引关联)(usort($arr, "cmp");)(比较函数时很普通函数的写法:function cmp($a, $b))
php自定义排序数组usort和uasort(uasort保持索引关联)(usort($arr, "cmp");)(比较函数时很普通函数的写法:function cmp($a, $ ...
- PHP匿名函数、闭包、function use
匿名函数,也叫闭包函数(closures) ,允许临时创建一个没有制定名称的函数.最常用作回调函数(callback)参数的值. 闭包函数也可以作为变量的值来使用.PHP将会自动把此种表达式转换成内置 ...
随机推荐
- [原创]基于rsync算法的目的性改进-RexSync
rsync是一种文件差异传输的算法,特点是高效且相似块识别率较高.具体算法这边就不赘述,网上很多,官方文档也描述的很清楚. rsync提高文件比对效率的一个核心算法之一就是rolling checks ...
- CentOS 6.5下Redis安装记录
Redis简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工 ...
- winform/窗体鼠标事件编程中的几个问题
1.进行.net窗体的开发,经常用到鼠标事件,如MouseDown/MouseUp/MouseMove/MouseClick等.可是有时候给控件添加鼠标事件,就是不响应,怎么办呢! 答案:1.控件是否 ...
- 不封装ajax 带url参数调用接口
html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- mysql apach php
一.MySql MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi格式的可以直接点击安装,按照它给出的安装提示进行安装(相信大家的英文可以看懂英文提示),一般MySQL将 ...
- oracle的decode函数在mysql的实现
oracle中的decode函数很好用,换成mysql中可以用类似下面的方法实现: SELECT IF(TRUE, '真值', '假值'); 如果想再弄复杂点,可以多个IF嵌套,不过嵌套的层次多了,代 ...
- Intellij Idea中的Jetty报出Web application not found src/main/webapp错误的解决方案
今天在Intellij Idea中编译项目的时候,运行起来一直会报出如下的错误: Web application not found src/main/webapp 当时感觉应该是什么文件缺少了.所以 ...
- ReactNative新手学习之路05 使用夜神模拟器调试ReactNative
1.首先确保adb环境添加到path环境 2.安装好夜神模拟器 3.运行模拟器 4.adb connect 127.0.0.1:62001 5.摇一摇设置IP和端口 如127.168. ...
- 奇虎360诉腾讯QQ垄断案之我见(3Q大战之我见)
这两款软件我都在用,要说时间最长感情最深的应该是腾讯QQ,1999年诞生的那年就在用QQ了! 不过感情归感情,个人看法归个人看法,不能用感情来判断. 正所谓外行看热闹,内行看门道.从事实上讲在使用这两 ...
- js 判断各种数据类型
了解js的都知道, 有个typeof 用来判断各种数据类型,有两种写法:typeof xxx ,typeof(xxx) 如下实例: typeof 2 输出 number ...