此概念的接触是在做分区表的时候碰到的,分区表按时间字段分区,在查询时当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 类型的函数,尽量不要声明。

最新文章

  1. O365(世纪互联)SharePoint 之使用列表库发布新闻
  2. Fabric远程自动化使用说明
  3. JSON格式互转集合
  4. 创建eclipse针对NDK的联合编译环境。
  5. 学习练习 java产生6个不同的数字
  6. sun.misc.unsafe类的使用
  7. wampserver安装后 mysql 所有数据库丢失的解决方案
  8. php判断手机浏览还是web浏览,并执行相应的动作
  9. 域名解析-delphi 源码
  10. duck type鸭子类型
  11. Plsql工具单步调试 存储过程或是 函数(oracle数据库)-留着自己用的
  12. 微信SDK使用总结
  13. 自学Unity3D 之 贪吃蛇
  14. python 爬取百度翻译进行中英互译
  15. Windows下pip 离线包安装
  16. 解决Intellij IDEA部署JavaWeb项目 404问题
  17. 如何加固linux NFS 服务安全的方法
  18. 【TCP/IP详解 卷一:协议】第二十章 TCP的成块数据流
  19. hdu 1175 bfs+priority_queue
  20. 《Python绝技:运用Python成为顶级黑客》 用Python实现免杀

热门文章

  1. Ubuntu配置Ruby和Rails
  2. [很郁闷]python2.7连接mysql5.5配置
  3. java进程占用CPU资源过高分析脚本
  4. OpenStack 企业私有云的若干需求(2):自动扩展(Auto-scaling) 支持
  5. Bootstrap 按钮
  6. AC日记——挤牛奶 洛谷 P1204
  7. 获取用户SID
  8. VMware 设备VMnet0 上的网桥暂时关闭。此虚拟机无法与主机或网格中的其他计算机通信【转】
  9. c#串口通信类代码可以直接调用
  10. .Net下几个服务框架介绍