postgresql - 是否可以在 Postgres 的索引中使用稳定函数?

标签 postgresql postgresql-9.0

我一直在处理一个项目,并且意识到我必须在几个查询的 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。一些最新的

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

关于postgresql - 是否可以在 Postgres 的索引中使用稳定函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10390777/

相关文章:

ruby - 如何使用 Sequel 运行 Postgres psql "slash"命令

postgresql - 使用 Postgis 和 pgRouting 的行车路线

sql - postgresql 查询无法完成

database - postgresql 中的指数问题

sql - tsvector 更新中的 Postgresql 正则表达式

sql - 在 PostgreSQL 中将列数据类型从文本更改为整数

PostgreSQL plpgsql - 可变列名

macos - Lion 中的 Brew 信息缺少 postgres 字符

postgresql - 错误 : function unnest(integer[]) does not exist in postgresql

sql - 连接有或没有记录的表