私はデータベースに不慣れで、インデックス作成がどのように機能するかをしっかりと把握していません。
加重されたtsvectorを含む列のインデックス作成を検討しています(タイトルに最大の加重が与えられ、次に小見出し、段落の内容が続きます)。Postgresのドキュメントによると、全文検索に使用するのにGINが最適であり、GiSTがそれに続きます。ただし、12.9章に注意事項があります。
GINインデックスは、推奨されるテキスト検索インデックスタイプです。転置インデックスとして、一致する場所の圧縮リストとともに、各単語(語彙素)のインデックスエントリが含まれます。複数単語の検索では、最初の一致を見つけてから、インデックスを使用して、追加の単語が不足している行を削除できます。GINインデックスは、tsvector値の単語(語彙素)のみを格納し、重みラベルは格納しません。したがって、重みを含むクエリを使用する場合は、テーブル行の再チェックが必要です。
これは、私のユースケースではGINが非効率的であり、GiSTを使用する必要があることを意味しますか、それともそれでも使用するのに最適ですか?最新のPostgresバージョン(12)を使用しています。
いいえ、GINインデックスを使用する必要があります。
インデックススキャンはフィルターとして機能し、できればほとんどの行を削除するため、再チェックする必要があるのはごくわずかです。
とにかくテーブルの行をフェッチする必要がある可能性があるため、インデックススキャン中に誤検知が多数検出されない限り、余分な作業はそれほど多くありません。
最良の方法は、データセットに対していくつかのベンチマークを実行することです。これにより、信頼できる回答が得られ、どのインデックスが自分の場合に適しているかがわかります。
ビットマップヒープスキャン中に除去された誤検知の数を確認するにEXPLAIN (ANALYZE, BUFFERS)
は、クエリの出力を調べます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加