Person、Names、Notesの3つのテーブルがあります。各人には複数の名前があり、オプションのメモがあります。名前とメモのいくつかの列で全文検索を行っています(以下を参照)。検索する単語が結果セットまたはdbにある場合、これらは完全に機能しています。これは、カスタム関数、php、およびpsql用です。問題は、検索した単語がデータベースに存在しない場合、phpとカスタム関数ではクエリが非常に遅くなりますが、psqlでは高速になることです。psqlでは1秒未満、その他は10秒以上です。
テーブル:
Person | id, birthday
Name | person_id, name, fs_name
Notes | person_id, note, fs_note
PKおよびFKインデックスのほかに、fs_nameおよびfs_noteのGinインデックス。
関数/クエリ
create or replace function queryNameFunc (TEXT)
returns TABLE(id int, name TEXT) as $$
select id, name
from person_name pnr
inner join person pr on (pnr.person_id=pr.id)
left join personal_notes psr on (psr.person_id = pr.id)
where pr.id in
(select distinct(id)
from person_name pn
inner join person p on (p.id = pn.person_id)
left join personal_notes ps on (ps.person_id = p.id)
where tname @@ to_tsquery($1)
limit 20);
$$ language SQL;
where条件はここで切り捨てられます。たとえば、$ 1で「john&james」を実行し、データがdbにある場合、結果は高速ですが、「john and james」がdbにない場合は、低速になります。個人に100万件、名前に300万件以上のレコード(すべてダミーレコード)があるため、これは遅くなりました。これを修正する方法について何かアイデアはありますか?サーバーを再起動して、postgresqlを再起動してみました。