他の場所でjjanesから読み取ったのと同じです。式インデックスは、式がクエリ述語で正確に一致する場合にのみ考慮されます。 PostgresクエリプランナーはAIではありません。計画に時間がかかりすぎると、クエリを高速化するという目的がすぐに無効になります。
それが慰めであるならば、あなたはあなたのインデックスを少し最適化することができます。 left()
substring()
よりもシンプルで高速です :
CREATE INDEX record_changes_log_detail_old_value_ix_btree
ON record_changes_log_detail (left(old_value,1024) text_pattern_ops);
また、最大行サイズは2704バイトです。 「Bツリーの2172文字の制限」ではなくbtreeインデックスの場合 。
最も重要なのは、質問が示唆するように、同等性チェックの場合のみ、md5(old_value)
を使用したハッシュ値のbtreeインデックスです。 またはhashtext(old_value)
多く もっと効率的。その場合は、ハッシュ衝突から防御することを忘れないでください そのように:
SELECT *
FROM record_changes_log_detail
WHERE hashtext(old_value) = hashtext('Gold Kerrison Neuro')
AND old_value = 'Gold Kerrison Neuro';
最初の述語は、高速なインデックスアクセスを提供します。 2番目は誤検知を除外します。衝突は非常にまれです。しかし、可能です。そして、その可能性はテーブルのサイズとともに大きくなります。
関連:
- グラフのテーブル構造でDISTINCTを使用したSELECTクエリは非常に低速です
- MD5フィールドに最適なデータ型は何ですか?
- CouchDBでの全文検索
または、すでに自分自身を検討しているようなハッシュインデックス:
- Postgres 11ハッシュインデックスが非常に大きいのはなぜですか?
(ここでは、ハッシュの衝突について心配する必要はありません。内部で処理されます。)