我一直在处理一个项目,并且意识到我必须在几个查询的 WHERE 子句中调用一个函数。性能并不糟糕,但我很乐意改进它。所以我看了看 docs for indexes其中提到:
An index field can be an expression computed from the values of one or more columns of the table row.
太棒了。所以我尝试创建一个索引:
在 foo_table (stable_function(foo_column)) 上创建索引 idx_foo;
并收到一个错误:
ERROR: functions in index expression must be marked IMMUTABLE
然后我读到了 Function Volatility Categories这是关于稳定波动的说法:
In particular, it is safe to use an expression containing such a function in an index scan condition.
根据措辞“索引扫描条件”,我猜它并不意味着实际的索引。那是什么意思呢?是否可以在索引中使用稳定函数?还是我们必须一路走下去,确保它作为一个不可变函数工作?
我们使用的是 Postgres v9.0.1。
最佳答案
“索引扫描条件”是一个搜索 条件,可以使用一个可变函数,该函数将在处理的每一行中调用。索引定义只能使用不可变的函数——也就是说,当使用任何给定的参数集调用时,该函数将始终返回相同的值,并且没有用户可见的副作用。如果您稍微考虑一下,您应该能够看到如果函数返回的值与创建索引条目时返回的值不同,您会遇到什么样的麻烦。
您可能想对数据库撒谎并将函数声明为不可变的,但实际上并非如此;但如果您这样做,数据库可能会做一些您不希望它做的令人惊讶的事情。
9.0.1 存在可修复的错误。请升级到 9.0。一些最新的。
关于postgresql - 是否可以在 Postgres 的索引中使用稳定函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10390777/