是否有可能在Postgres的索引使用稳定的功能?(Is it possible to use a

2019-09-16 22:00发布

我一直在工作的项目,并已经开始,我必须在几个查询WHERE子句中调用一个函数的实现。 性能并不可怕准确,但我很想来改善它。 所以,我看着文档的索引其中提到:

索引字段可以是从表中的行的一个或多个列的值来计算的表达式。

真棒。 所以,我想创建一个索引:

CREATE INDEX idx_foo ON foo_table (stable_function(foo_column));

并收到一个错误:

错误:在指数表达式函数必须被标记IMMUTABLE

于是我阅读功能易失性范畴 ,其有此说关于稳定波动:

特别地,它是安全的在索引扫描条件使用含有这样的函数的表达式。

基于短语“索引扫描条件”我猜,这并不意味着实际的指数。 所以,这是什么意思? 是否有可能利用在指数稳定的功能? 还是我们要一直走下去,并确保这样的工作作为一个不可变的功能?

我们使用的是Postgres v9.0.1。

Answer 1:

“索引扫描条件”是搜索条件,并且可以使用易失性函数,其将被称为用于处理的每一行。 也就是说,当有任何给定的参数调用该函数总是返回相同的值,并且没有用户可见的副作用-如果它是不可变的索引定义只能使用一个功能。 如果你想想看一点点,你应该可以看到你可以进入,如果函数可能返回比创建索引条目时,它做了不同的值什么样的麻烦。

你可能会骗数据库,并声明函数为不可改变这是不是真的; 但如果这样做,数据库可能会做,你宁愿它没有意料之中的事情。

9.0.1有缺陷的修复,其可用。 请升级到9.0。 somethingrecent。

http://www.postgresql.org/support/versioning/



文章来源: Is it possible to use a stable function in an index in Postgres?