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

正規表現パターンを含むテキスト列に便利なインデックスを付ける方法はありますか?

    方法はありません

    インデックスにはIMMUTABLEが必要です 式。式の結果は、入力文字列によって異なります。すべての行の式を評価する以外に方法はありません。つまり、シーケンシャルスキャンです。

    IMMUTABLEの詳細を含む関連回答 角度:

    あなたのケースには回避策がないというだけで、不可能 インデックスを作成します。インデックスはタプルに定数値を格納する必要がありますが、すべての行の結果の値が入力に基づいて計算されるため、これは使用できません。また、列の値を見ずに入力を変換することはできません。

    Postgresインデックスの使用は演算子にバインドされ、式のインデックスのみが 演算子のを使用できます(同じ論理的制約のため)。詳細:

    多くの演算子は、 COMMUTATORを定義します。 これにより、クエリプランナー/オプティマイザーはインデックス付きの式を左に反転できます。簡単な例:=の整流子 =です 。 >の整流子 は< およびその逆。 ドキュメント:

    正規表現一致演算子~ 整流子はありません。それは不可能だからです。自分の目で確かめてください:

    SELECT oprname, oprright::regtype, oprleft::regtype, oprcom
    FROM   pg_operator
    WHERE  oprname = '~'
    AND    'text'::regtype IN (oprright, oprleft);
    
     oprname | oprright |  oprleft  | oprcom
    ---------+----------+-----------+------------
     ~       | text     | name      | 0
     ~       | text     | text      | 0
     ~       | text     | character | 0
     ~       | text     | citext    | 0
    

    そして、こちらのマニュアルを参照してください:

    私は以前に試したことがあり、プリンシパルでは不可能であることを受け入れなければなりませんでした 。




    1. PostgreSQLでのデータベースの一覧表示と切り替え

    2. PostgreSQLセキュリティのベストプラクティス

    3. IN演算子を使用したMySQLクエリの最適化

    4. ケーススタディ:ARKWARE MS ACCESS CRM