PostgreSQLクエリプランナーは賢いですが、AIではありません。 式のインデックスを使用するようにするには まったく同じ表現形式を使用する クエリで。
次のようなインデックスを使用する場合:
CREATE INDEX t_a_lower_idx ON t (lower(substring(a, 1, 4)));
またはPostgreSQL9.1ではもっと簡単です:
CREATE INDEX t_a_lower_idx ON t (lower(left(a, 4)));
このクエリを使用します:
SELECT * FROM t WHERE lower(left(a, 4)) = 'abcd';
これは100%機能的に同等です:
SELECT * FROM t WHERE lower(a) LIKE 'abcd%'
または:
SELECT * FROM t WHERE a ILIKE 'abcd%'
しかし、そうではありません :
SELECT * FROM t WHERE a LIKE 'abcd%'
これは機能的に異なるクエリです 異なるが必要です インデックス:
CREATE INDEX t_a_idx ON t (substring(a, 1, 4));
またはPostgreSQL9.1でより簡単に:
CREATE INDEX t_a_idx ON t (left(a, 4));
そして、このクエリを使用します:
SELECT * FROM t WHERE left(a, 4) = 'abcd';
可変長の左アンカー検索用語
大文字小文字を区別しません。インデックス:
編集 :ほとんど忘れてしまった:デフォルトの「C」以外のロケールでデータベースを実行する場合は、演算子クラスを明示的に指定します
-text_pattern_ops
私の例では:
CREATE INDEX t_a_lower_idx
ON t (lower(left(a, <insert_max_length>)) text_pattern_ops);
クエリ:
SELECT * FROM t WHERE lower(left(a, <insert_max_length>)) ~~ 'abcdef%';
インデックスを利用でき、固定長のバリアントとほぼ同じ速度です。
この~>=~
に関する最後の部分 および~<~
。