3

我一直在从事一个工作项目,并意识到我必须在几个查询的 WHERE 子句中调用一个函数。性能并不完全糟糕,但我很想改进它。所以我查看了文档中提到的索引:

索引字段可以是根据表格行的一个或多个列的值计算的表达式。

惊人的。所以我尝试创建一个索引:

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

并收到一个错误:

错误:索引表达式中的函数必须标记为 IMMUTABLE

然后我读到了关于稳定波动率的函数波动率类别:

特别是,在索引扫描条件中使用包含此类函数的表达式是安全的。

基于措辞“索引扫描条件”,我猜这并不意味着实际的索引。那么这是什么意思呢?是否可以在索引中使用稳定的函数?还是我们必须一路走下去,确保它可以作为一个不可变的函数工作?

我们正在使用 Postgres v9.0.1。

4

1 回答 1

5

“索引扫描条件”是搜索条件,可以使用 volatile 函数,该函数将为处理的每一行调用。索引定义只能使用不可变的函数——也就是说,当使用任何给定的参数集调用该函数时,该函数将始终返回相同的值,并且没有用户可见的副作用。如果您稍微考虑一下,您应该能够看到如果该函数可能返回与创建索引条目时不同的值,您会遇到什么样的麻烦。

您可能很想对数据库撒谎并声明一个函数是不可变的,这不是真的;但是如果你这样做了,数据库可能会做一些你不希望它做的令人惊讶的事情。

9.0.1 有可修复的错误。请升级到 9.0。最近的事

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

于 2012-04-30T22:00:05.467 回答