此概念的接触是在做分区表的时候碰到的,分区表按时间字段分区,在查询时当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)的更多相关文章

  1. typedef 函数指针 数组 std::function

    1.整型指针 typedef int* PINT;或typedef int *PINT; 2.结构体 typedef struct { double data;}DATA,  *PDATA;  //D ...

  2. 一个不错的PHP二维数组排序函数简单易用存用

    一个不错的PHP二维数组排序函数简单易用存用 传入数组,传入排序的键,传入排序顺序 public function array_sort($arr,$keys,$type='asc') { $keys ...

  3. Java并发编程(六)原子性与易变性

    原子性 原子是最小单元.不可再分的意思.原子性是指某个操作在获取CPU时间时,要么就给它足够时间,让这个操作执行完,要么就不执行这个操作,执行时不能出现上下文切换(把CPU时间从一个线程分配到另一个线 ...

  4. JavaScript 函数声明与函数表达式的区别 函数声明提升(function declaration hoisting)

    解析器在向执行环境中加载数据时,对函数声明和函数表达式并非一视同仁.解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问).至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真的被 ...

  5. 高阶函数之函数柯里化function currying

    var cost = (function(){    var args = [];    return function(){        if(arguments.length === 0){   ...

  6. 样条函数(spline function)—— 分段多项式函数(piecewise polynomial function)

    1. 分段多项式函数 样条函数是某种意义上的分段函数. Spline (mathematics) - Wikipedia 最简单的样条函数是一种分段多项式函数(piecewise polynomial ...

  7. java 并发原子性与易变性 来自thinking in java4 21.3.3

    java 并发原子性与易变性  具体介绍请參阅thinking in java4 21.3.3 thinking in java 4免费下载:http://download.csdn.net/deta ...

  8. php自定义排序数组usort和uasort(uasort保持索引关联)(usort($arr, "cmp");)(比较函数时很普通函数的写法:function cmp($a, $b))

    php自定义排序数组usort和uasort(uasort保持索引关联)(usort($arr, "cmp");)(比较函数时很普通函数的写法:function cmp($a, $ ...

  9. PHP匿名函数、闭包、function use

    匿名函数,也叫闭包函数(closures) ,允许临时创建一个没有制定名称的函数.最常用作回调函数(callback)参数的值. 闭包函数也可以作为变量的值来使用.PHP将会自动把此种表达式转换成内置 ...

随机推荐

  1. mysqld设置密码

    用root 进入mysql后 mysql>set password =password('你的密码'); mysql>flush privileges;   登录: mysql -u ro ...

  2. iptables详解

    Netfilter包含有三种表,三种表下共包含有五种链,链下面包含各种规则.即表包含若干链,链包含若干规则.  (一)三种表为:filter   nat  mangle 1.filter:处理与本机有 ...

  3. Selenium2(WebDriver)_如何判断WebElement元素对象是否存在

    1. selenium中如果去寻找元素,而元素不存在的话,通常会抛出NoSuchElementException 导致测试失败,但有时候,我们需要去确保页面元素不存在,才是我们正确的验收条件下面的方法 ...

  4. backbone学习总结(二)

    今天来看下backbone的路由控制的功能.其实个人感觉backbone,模块就那么几个,熟悉它的框架结构,以及组成,就差不多. 废话不多说,我们来看看还剩下的功能. 关于路由和历史管理 通过 Bac ...

  5. SQL笔记

    1.增加.删除约束 ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE(列1名,列名2) ALTER TABLE 表名 DROP CONSTRAINT 约束名 2.查询更 ...

  6. [转有改动]vi

    转自http://www.51testing.com/html/86/427686-247344.html 多按几次[ESC],系统会发出滴滴声以确定进入命令模式.就进入了命令模式,所有在键盘上打的字 ...

  7. Apache Shiro系列四,概述 —— Shiro的架构

    Shiro的设计目标就是让应用程序的安全管理更简单.更直观.     软件系统一般是基于用户故事来做设计.也就是我们会基于一个客户如何与这个软件系统交互来设计用户界面和服务接口.比如,你可能会说:“如 ...

  8. c#串口通信类代码可以直接调用

    文章首发于浩瀚先森博客 直接上代码 public struct SerialPara { private string portName; public string PortNameSetGet { ...

  9. AnimationsDemo中的ZoomActivity代码分析

    AnimationsDemo是android官网的一个动画使用示例. ZoomActivity是demo中的图像缩放动画,因为这种效果比较常见,所以研究了一下代码. 下面是效果图: 毫无疑问这是一个组 ...

  10. 高级数组-ArrayList

    可以放入任意类型的数据 ArrayList alist=new ArrayList(); alist.Add(440;//装箱,讲int类型的值转换为引用类型 int i1=(int)alist[0] ...