【发布时间】:2012-05-10 13:42:51
【问题描述】:
我一直在从事一个项目,并意识到我必须在几个查询的 WHERE 子句中调用一个函数。性能并不完全糟糕,但我很想改进它。所以我查看了docs for indexes,其中提到:
索引字段可以是根据表格行的一列或多列的值计算得出的表达式。
太棒了。所以我尝试创建一个索引:
CREATE INDEX idx_foo ON foo_table (stable_function(foo_column));
并收到错误:
错误:索引表达式中的函数必须标记为 IMMUTABLE
然后我读到了Function Volatility Categories,其中提到了稳定波动性:
特别是,在索引扫描条件中使用包含此类函数的表达式是安全的。
根据措辞“索引扫描条件”,我猜这并不意味着实际索引。那么这是什么意思呢?是否可以在索引中使用稳定的函数?还是我们必须一路走下去,确保它可以作为一个不可变的函数工作?
我们正在使用 Postgres v9.0.1。
【问题讨论】: