2016-11-21 4 views
1

full_name列とstate列を使用して複数列インデックスを設定する最適な方法は何ですか?検索では、full_name列の部分検索で正確な状態が使用されます。部分列検索で複数列インデックスを正しく構成する方法

WHERE full_name ~* 'jones' AND state = 'CA'; 

は約20万レコードの検索クエリはこれを好きになるでしょう。

ありがとうございます!

ジョン

答えて

0

状態が十分にストレートフォワードようです - 通常のインデックスは十分です。フルネーム検索では、これはたくさんの仕事ですが、2,000万レコードでは、配当は自分自身で話すと思います。

のtsvectorとして、あなたのテーブルに新しいフィールドを作成し、この例のためfull_name_searchそれを呼び出す:可能であれば

update <blah> 
set full_name_search = to_tsvector (full_name); 

alter table <blah> add column full_name_search tsvector; 

は、カラムの初期集団を行います、フィールドをnull不可能にします。

それが更新されますいつでも自動的にこのフィールドに移入されますトリガーを作成します。を検索するクエリを再構築し、ここから

create index <blah>_ix1 on <blah> 
using gin(full_name_search); 

create trigger <blah>_insert_update 
before insert or update on <blah> 
for each row execute procedure 
    tsvector_update_trigger(full_name_search,'pg_catalog.english',full_name); 

が新しいフィールドにインデックスを追加します。テキストフィールドの代わりにtsvectorフィールドを使用します。

WHERE full_name_search @@ to_tsquery('jones') AND state = 'CA'; 

これらのステップのいくつか(たとえば、余分なフィールドを作成せずに代わりに関数ベースのインデックスを使用する)では、パフォーマンスは向上しますが、得られるものほど良くはありません。

1つの警告 - 私はto_tsvector内容で論理的な破損に基づいてベクトル成分に分割すると思うので、これは:

Catherine Jones Is a Nice Lady 

正常に動作しますが、この:おそらく

I've been Jonesing all day 

されません。

+0

実際に 'full_name_search'カラムをテーブルに追加する必要はないと思います。 'to_tsvector(full_name)'に直接インデックスを作成することができます –

+0

@a_horse_with_no_name - 間違っているかもしれませんが、ある時点で私は2つのベンチマークを行いました。これは後のリリースで変更されている可能性があります、そして、私は間違っている可能性もあります。 – Hambone

+0

John - 私は両方を試してみることをお勧めします。フィールドを追加する価値があるかどうかは、その違いを見たいと思っています。 – Hambone

関連する問題