テキスト列でtext_pattern_opsにインデックスを付けるのはなぜですか?


18

今日、Seven WeeksのSeven Databasesでは、オペレーターごとのインデックスを紹介しました。

text_pattern_ops値が小文字でイ​​ンデックス付けされている限り、演算子クラスインデックスを作成することにより、以前のクエリに一致するパターンの文字列にインデックスを付けることができます。

CREATE INDEX moves_title_pattern ON movies (
    (lower(title) text_pattern_ops);

text_pattern_opsタイトルがテキストタイプであるため、これを使用しました。あなたは、インデックスのvarchar、文字、または名前に必要な場合は、関連するオペレーションを使用しますvarchar_pattern_opsbpchar_pattern_opsname_pattern_ops

この例は本当に紛らわしいと思います。なぜこれが便利なのですか?

列がテキストタイプの場合、他のタイプ(varchar、char、name)は検索値として使用される前にテキストにキャストされませんか?

そのインデックスは、デフォルト演算子を使用したインデックスとどのように動作しますか?

CREATE INDEX moves_title_pattern ON movies (lower(title));

1
この関連の質問は助けになることがあります。dba.stackexchange.com/questions/10694/...
アーウィンBrandstetter

ありがとう、アーウィン。その質問に対するあなたの答えは、本のアイデアを研究するときに非常に役に立ちました。
イアンサミュエルマクリーン長老

回答:


20

多くの場合、ドキュメントにはそのような質問に対する答えが記載されています。この場合も同様です:

演算子クラスtext_pattern_ops、varchar_pattern_ops、およびbpchar_pattern_opsは、それぞれtext、varchar、およびchar型のBツリーインデックスをサポートします。デフォルトの演算子クラスとの違いは、ロケール固有の照合規則に従ってではなく、文字ごとに値が厳密に比較されることです。これにより、データベースが標準の「C」ロケールを使用していない場合、これらの演算子クラスは、パターンマッチング式(LIKEまたはPOSIX正規表現)を含むクエリでの使用に適しています。例として、次のようにvarchar列にインデックスを付けることができます。

CREATE INDEX test_index ON test_table (col varchar_pattern_ops);

通常の<、<=、>、または> =比較を含むクエリでインデックスを使用する場合は、デフォルトの演算子クラスでインデックスを作成する必要があることに注意してくださいそのようなクエリはxxx_pattern_ops演算子クラスを使用できません。(通常の等値比較では、これらの演算子クラスを使用できます。)異なる演算子クラスを使用して、同じ列に複数のインデックスを作成することができます。

ドキュメントには次のように書かれています:

Cロケールを使用する場合、xxx_pattern_ops演算子クラスは必要ありません。デフォルトの演算子クラスのインデックスは、Cロケールのパターンマッチングクエリに使用できるためです。

次のようにロケールを確認できます(「C」ではなくUTF8である可能性が高い)。

postgres=> show lc_collate;
 lc_collate
-------------
 en_GB.UTF-8

あぁ!私はそれを読みましたが、従うのが難しいので、それを取り入れませんでした。の有用な有用性はtext_pattern_opsロケールに依存すると言いますか?私のロケールは「C」ではなく「en_US.UTF-8」であるため、パターンクエリはデフォルトのインデックスを使用できません。
イアンサミュエルマクリーン長老

丁度。追加します(ただし、これは単なる推測に過ぎません)。基本的なASCII文字内にデータが残っていると、既定の演算子クラスも同じように良好です。
dezso

5
@dezso:LIKEプレーンBツリーインデックスを使用したクエリを見た場合、dbはCロケールを使用している必要があります。または、インデックスはCOLLATE "POSIX"(またはCOLLATE "C")で定義され、クエリは一致を指定しますCOLLATION。他の照合では、インデックスの順序がロケールルールと一致しないため、パターンマッチングに使用できません。
アーウィンブランドステッター

1
@ErwinBrandstetter私は確認しなければなりません、あなたは正しいです。
dezso

1
@StopHarmingMonicaを使用すると、正しい応答(エラーなし)が得られます。インデックスを使用できず、クエリの速度が低下する可能性があります。
dezso
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.