3

私は仕事でプロジェクトに取り組んできましたが、クエリのWHERE句のいくつかで関数を呼び出さなければならないことに気づきました。パフォーマンスはそれほどひどいものではありませんが、改善したいと思います。だから私はそれを述べたインデックスのドキュメントを見ました:

インデックスフィールドは、テーブル行の1つ以上の列の値から計算された式にすることができます。

素晴らしい。そこで、インデックスを作成してみました。

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

そしてエラーを受け取りました:

エラー:インデックス式の関数はIMMUTABLEとマークする必要があります

それで私は安定したボラティリティについてこう言っている関数ボラティリティカテゴリーについて読みました:

特に、このような関数を含む式をインデックススキャン条件で使用するのが安全です。

「インデックススキャン条件」という言い回しからすると、実際のインデックスを意味するものではないと思います。それで、それはどういう意味ですか?インデックスで安定した関数を利用することは可能ですか?それとも、ずっと進んで、これが不変の関数として機能することを確認する必要がありますか?

Postgresv9.0.1を使用しています。

4

1 に答える 1

5

「インデックススキャン条件」は検索条件であり、処理される行ごとに呼び出される揮発性関数を使用できます。インデックス定義は、関数が不変である場合にのみ関数を使用できます。つまり、その関数は、任意の引数のセットで呼び出されたときに常に同じ値を返し、ユーザーに表示される副作用はありません。少し考えてみると、関数がインデックスエントリの作成時とは異なる値を返す可能性がある場合に、どのような問題が発生する可能性があるかがわかります。

データベースに嘘をつき、関数を不変として宣言したくなるかもしれませんが、実際にはそうではありません。しかし、そうすると、データベースはおそらく、あなたがやらなかったはずの驚くべきことをするでしょう。

9.0.1には、修正が可能なバグがあります。9.0にアップグレードしてください。何か最近

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

于 2012-04-30T22:00:05.467 に答える