方法はありません 。
インデックスには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
私は以前に試したことがあり、プリンシパルでは不可能であることを受け入れなければなりませんでした 。