sql >> データベース >  >> RDS >> PostgreSQL

式インデックスの検索

    他の場所で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ハッシュインデックスが非常に大きいのはなぜですか?

    (ここでは、ハッシュの衝突について心配する必要はありません。内部で処理されます。)




    1. 列名でピボット解除

    2. Oracleで一括収集して即時実行

    3. PSQLでユーザーを作成する方法

    4. SQL AS:使用法、例、およびそれがどのようにあなたに最も利益をもたらすことができるか