我一直在研究一个正在工作的项目,并且已经意识到我必须在几个查询的WHERE子句中调用一个函数。表现并不完全是可怕的,但我很乐意改进它。所以我查看了提到的docs for indexes:
索引字段可以是根据表行的一列或多列的值计算的表达式。
真棒。所以我尝试创建一个索引:
CREATE INDEX idx_foo ON foo_table (stable_function(foo_column));
收到错误:
错误:索引表达式中的函数必须标记为IMMUTABLE
那么我读到了关于稳定波动性的Function Volatility Categories:
特别是,在索引扫描条件下使用包含此类函数的表达式是安全的。
根据短语“索引扫描条件”,我猜它并不意味着实际索引。那是什么意思呢?是否可以在索引中使用稳定函数?或者我们必须一直走下去并确保这可以作为一个不可变的函数吗?
我们正在使用Postgres v9.0.1。
答案 0 :(得分:4)
“索引扫描条件”是搜索条件,并且可以使用volatile函数,该函数将针对每个处理的行调用。索引定义只能使用函数,如果它是不可变的 - 也就是说,当使用任何给定的参数集调用时,该函数将始终返回相同的值,并且没有用户可见的副作用。如果你仔细考虑一下,你应该能够看到如果函数可能返回的值与创建索引条目时的值不同,可能会遇到什么样的麻烦。
你可能会试图欺骗数据库,并将一个函数声明为不可变的,这不是真的;但是,如果你这样做,数据库可能会做一些你不愿意做的令人惊讶的事情。
9.0.1存在可用修复程序的错误。请升级到9.0。 somethingrecent 。