StackOverflowの9月のデータダンプをサンプルデータとして使用して、PostgreSQLのテキスト検索機能をテストしています。 :-)なぜPostgreSQLのテキスト検索GiSTインデックスはGINインデックスよりもはるかに遅いのですか?
120万行を検索し、一致LIKE
述語やPOSIX正規表現を使用しての単純なアプローチは、キーワードを探して全表スキャンを実行するために(私のMacBook上)について90-105秒かかります。
SELECT * FROM Posts WHERE body LIKE '%postgresql%';
SELECT * FROM Posts WHERE body ~ 'postgresql';
インデックスのない、アドホックテキスト検索クエリを約8分を取る:GINインデックスを作成する
SELECT * FROM Posts WHERE to_tsvector(body) @@ to_tsquery('postgresql');
約40分取ります
ALTER TABLE Posts ADD COLUMN PostText TSVECTOR;
UPDATE Posts SET PostText = to_tsvector(body);
CREATE INDEX PostText_GIN ON Posts USING GIN(PostText);
を(I表現インデックスとして定義することで、これを1つのステップで行うこともできます。
私はGiSTインデックスを作成するときにSELECT * FROM Posts WHERE PostText @@ 'postgresql';
は、しかし、結果はかなり異なっている:これは約40ミリ秒を取る -
その後、GINインデックスにより補助クエリがはるかに高速に実行されます。
CREATE INDEX PostText_GIN ON Posts USING GIST(PostText);
その後、@@
テキスト検索演算子を使用してクエリが90-100秒とります。これは、インデックスを作成するために、以下2分かかります。したがって、GiSTインデックスは、索引付けされていないTSクエリを8分から1.5分に改善します。しかし、それはLIKE
で完全なテーブルスキャンを行うよりも改善されていません。ウェブプログラミング環境では役に立たない。
私はGiSTインデックスを使用する上で重要な何かを見逃していますか?索引をメモリなどにプリキャッシュする必要がありますか?私はMacPortsからの単純なPostgreSQLインストールを使用していますが、調整はしていません。
GiSTインデックスを使用する推奨される方法は何ですか?あるいは、PostgreSQLでTSをやっている人は誰もGiSTインデックスをスキップし、GINインデックスのみを使用しますか?
PS:私はSphinx SearchやLuceneのような選択肢について知っています。私はPostgreSQL自体が提供する機能について学びたいだけです。
感謝されている必要があり、私は」あなたの提案を試してみよう... –
そのインデックスを生成するのにかなり時間がかかっているに違いありません。 :) –
'varchar_pattern_ops'が' varchar'型で、 'PostText'が' tsvector'型で、 'bstree'と' hash'インデックスのみで定義され、 'gist'では定義されていないので、これはうまく動作しません。 –