6

PostgreSQL 9.3 DB に 3 億のアドレスがあり、pg_trgm を使用して行をあいまい検索したいと考えています。最終的な目的は、Google マップ検索のような検索機能を実装することです。

pg_trgm を使用してこれらのアドレスを検索したところ、結果を取得するのに約 30 秒かかりました。デフォルトの類似度しきい値条件 0.3 に一致する行は多数ありますが、必要な結果は 5 ~ 10 程度です。トリグラム GiST インデックスを作成しました。

CREATE INDEX addresses_trgm_index ON addresses USING gist (address gist_trgm_ops);

これは私のクエリです:

SELECT address, similarity(address, '981 maun st') AS sml 
FROM addresses 
WHERE address % '981 maun st' 
ORDER BY sml DESC 
LIMIT 10;

本番環境のテスト テーブルは削除されました。EXPLAINテスト環境からの出力を示します。約 700 万行あり、結果を得るには約 1.6 秒かかります。3億で、30秒以上必要です。

ebdb=> explain analyse select address, similarity(address, '781 maun st') as sml from addresses where address % '781 maun st' order by sml desc limit 10;
                                    QUERY PLAN                                                                            
————————————————————————————————————————————————————————————————————————————————    
 Limit  (cost=7615.83..7615.86 rows=10 width=16) (actual time=1661.004..1661.010 rows=10 loops=1)
 ->  Sort  (cost=7615.83..7634.00 rows=7268 width=16) (actual time=1661.003..1661.005 rows=10 loops=1)
     Sort Key: (similarity((address)::text, '781 maun st'::text))
     Sort Method: top-N heapsort  Memory: 25kB
     ->  Index Scan using addresses_trgm_index on addresses  (cost=0.41..7458.78 rows=7268 width=16) (actual time=0.659..1656.386 rows=5241 loops=1)
           Index Cond: ((address)::text % '781 maun st'::text)
 Total runtime: 1661.066 ms
(7 rows)

パフォーマンスを改善する良い方法はありますか、それともテーブルのパーティション分割を行うのは良い計画ですか?

4

1 に答える 1