Rya*_*sal 3 postgresql postgresql-9.0
我一直在研究一个项目,并意识到我必须在几个查询的 WHERE 子句中调用一个函数。性能并不可怕,但我很想改进它。所以我查看了索引的文档,其中提到:
索引字段可以是根据表行的一列或多列的值计算得出的表达式。
惊人的。所以我尝试创建一个索引:
CREATE INDEX idx_foo ON foo_table (stable_function(foo_column));
并收到一个错误:
错误:索引表达式中的函数必须标记为 IMMUTABLE
然后我阅读了关于函数波动率类别的内容,其中有关于稳定波动率的内容:
特别是,在索引扫描条件中使用包含此类函数的表达式是安全的。
根据措辞“索引扫描条件”,我猜这并不意味着实际的索引。那么它是什么意思呢?是否可以在索引中使用稳定函数?或者我们必须一路走下去并确保它可以作为一个不可变的函数工作?
我们使用的是 Postgres v9.0.1。
“索引扫描条件”是一个搜索条件,可以使用一个 volatile 函数,该函数将为处理的每一行调用。索引定义只能使用不可变的函数——也就是说,当使用任何给定的参数集调用该函数时,该函数将始终返回相同的值,并且没有用户可见的副作用。如果您稍微思考一下,您应该能够看到如果函数返回的值可能与创建索引条目时的值不同,您会遇到什么样的麻烦。
您可能想对数据库撒谎,并声明一个函数为不可变的,但实际上并非如此;但是如果你这样做,数据库可能会做一些你宁愿它没有做的令人惊讶的事情。
9.0.1 有可用修复的错误。请升级到 9.0。最近的事。
http://www.postgresql.org/support/versioning/
| 归档时间: |
|
| 查看次数: |
1007 次 |
| 最近记录: |