web-dev-qa-db-ja.com

BRINインデックスはENUMタイプをサポートしていますか?

BRINインデックスは便利に思えますが、ENUMタイプでどのように使用するかはわかりません。私はこのコードがうまくいくと思いました:

CREATE TYPE test_enum AS ENUM ('a', 'b');
CREATE TEMPORARY TABLE my_table (
    x test_enum
);

CREATE INDEX test_index ON my_table using brin (x);
ERROR:  data type test_enum has no default operator class for access method "brin"

新しい演算子クラスを作成する を最初から作成する必要がありますか?列挙型はすでに注文されていませんか?

2014年からのこのコミット は、BRINインデックスがENUMタイプで機能することを意味します。

5
karldw

列挙型はすでに注文されていませんか?

いいえ

2014年からのこのコミットは、BRINインデックスがENUMタイプで機能することを意味しています。

それは実際にはそのコミットメントが言うことではありません。 指定したリンクのコミットメッセージ から

このタイプの演算子クラスは「Minmax」と呼ばれ、Bツリーopclassを使用して、ほとんどのデータ型にそれらを提供します。 BRINコードは一般化されているため、他のアプローチは、配列、幾何タイプ、範囲などの可能です。列挙型などの場合でも、couldはminmaxとは異なる何かを実行して、より良い結果をもたらします。このコミットでは、minmaxのみを含めています。

それが今あるという意味ではありません。 「パッチ受け入れ済み」のPostgreSQLです。実際、コミットは明示的に言っています、

+/* no brin opclass for enum, tsvector, tsquery, jsonb, range */

実際、ENUMのBRINインデックスを作成するには、Cをある程度使用し、インデックス演算子クラスの実装に関する知識(pick/split/insert/merge)が必要になります。

5
Evan Carroll