【问题标题】:Is it possible to use a stable function in an index in Postgres?是否可以在 Postgres 的索引中使用稳定的函数?
【发布时间】: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。

【问题讨论】:

    标签: postgresql postgresql-9.0


    【解决方案1】:

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

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

    9.0.1 存在可修复的错误。请升级到 9.0。最近的东西。

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

    【讨论】:

      猜你喜欢
      • 2013-10-23
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 2012-05-22
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      相关资源
      最近更新 更多