答えは、Postgresのバージョン、エンコーディング、ロケールなどの多くの要因によって異なります- LC_COLLATE 特に。
裸の式lower(description)LIKE'%abc%' 通常、 description ILIKE'%abc%'よりも少し高速です 、およびどちらも同等の正規表現よりも少し高速です: description〜*'abc' 。これは、テストされたすべての行に対して式を評価する必要があるシーケンシャルスキャンで重要です。
しかし あなたが答えで示すような大きなテーブルの場合、確かにインデックスを使用します。任意のパターン(左アンカーだけでなく)の場合、追加モジュール pg_trgmを使用してトリグラムインデックスを提案します 。次に、秒ではなくミリ秒について説明します。上記の式の違いは無効になります。
GINおよびGiSTインデックス( gin_trgm_ops を使用) またはgist_trgm_ops 演算子クラス)は LIKEをサポートします ( ~~ )、 ILIKE ( ~~ * )、〜コード> 、〜* (そしていくつかのより多くの変種)同様に。 descriptionにトリグラムGINインデックスを使用 (通常はGiSTよりも大きいですが、読み取りは高速です)、クエリでは description ILIKE'case_insensitive_pattern'を使用します。 。
関連:
- PostgreSQLLIKEクエリのパフォーマンスのバリエーション
- オートコンプリートフィールド用の同様のUTF-8文字列
Postgresでのパターンマッチングの基本:
- PostgreSQLのLIKE、SIMILAR TO、または正規表現とのパターンマッチング
上記のトリグラムインデックスを使用する場合、通常です。 より実用的な作業:
description ILIKE '%abc%'
または、大文字と小文字を区別しない正規表現演算子を使用します(%なし) ワイルドカード):
description ~* 'abc'
(description)のインデックス lower(description)でのクエリはサポートしていません のように:
lower(description) LIKE '%abc%'
およびその逆。
lower(description)の述語を使用 排他的に 、式インデックスは少し良いオプションです。
それ以外の場合は、(description)のインデックス 両方をサポートするため、望ましいです 大文字と小文字を区別する述語と大文字と小文字を区別しない述語。