6

次のような多くのテストフィールドを含むクエリがあります。

SELECT * FROM some-table
  WHERE field1 ILIKE "%thing%"
     OR field2 ILIKE "%thing"
     OR field3 ILIKE "%thing";

列はほとんどすべて varchar(50) またはその付近です。これで、パフォーマンスを向上させるには、検索対象のフィールドにインデックスを付ける必要があることがわかりました。ILIKE を TSEARCH に完全に置き換えることを検討する必要がありますか?

4

3 に答える 3

15

全文検索の設定は、「含む」のようなクエリと同じではありません。単語などを語幹化するので、「車」と「車」を一致させることができます。

本当に高速な ILIKE が必要な場合は、標準のデータベース インデックスや FTS は役に立ちません。幸いなことに、pg_trgm モジュールはそれを行うことができます。

于 2012-08-26T07:16:33.823 に答える
5

非常に重要なことの1つは、B-TREEINDEXがこの種の検索を改善することはないということです。

where field ilike '%SOMETHING%'

私が言っているのは、あなたが次のことをした場合です:

create index idx_name on some_table(field);

改善する唯一のアクセスはですwhere field like 'something%'。(リテラルで始まる値を検索する場合)。fieldしたがって、この場合、列に通常のインデックスを追加してもメリットはありません。

検索の応答時間を改善する必要がある場合は、全文検索の使用を必ず検討してください。

于 2012-08-26T00:05:02.933 に答える
3

他の人が言ったことに少し追加します。

まず、文字列の途中の値に基づくインデックスを実際に使用することはできません。インデックスは一般にツリー検索であり、テーブルをスキャンするよりも検索が高速かどうかを知る方法がないため、PostgreSQL はデフォルトで seq スキャンを使用します。インデックスは、文字列の最初の部分と一致する場合にのみ使用されます。そう:

SELECT * FROM invoice
  WHERE invoice_number like 'INV-2012-435%'

インデックスを使用できますが、使用like '%44354456%'できません。

一般に、LedgerSMB では、実行する検索の種類に応じて両方を使用します。次のような検索が表示される場合があります。

select * from parts
  WHERE partnumber ilike ?  || '%'
    and plainto_tsquery(get_default_language(), ?) @@ description;

したがって、これらは非常に異なります。最も意味のある場所でそれぞれを使用してください。

于 2012-08-26T13:41:10.790 に答える