Det finns ingen möjlighet .
Index kräver IMMUTABLE
uttryck. Resultatet av ditt uttryck beror på inmatningssträngen. Jag ser inget annat sätt än att utvärdera uttrycket för varje rad, vilket betyder en sekventiell skanning.
Relaterat svar med mer information om IMMUTABLE
vinkel:
Bara att det inte finns någon lösning för ditt fall, vilket är omöjligt att indexera. Indexet måste lagra konstanta värden i sina tuplar, vilket helt enkelt inte är tillgängligt eftersom det resulterande värdet för varje rad beräknas baserat på indata. Och du kan inte transformera indata utan att titta på kolumnvärdet.
Postgres indexanvändning är bunden till operatorer och indexerar endast på uttryck vänster av operatören kan användas (på grund av samma logiska begränsningar). Mer:
Många operatörer definierar en COMMUTATOR
vilket gör att frågeplaneraren/optimeraren kan vända de indexerade uttrycken åt vänster. Enkelt exempel:Kommutatorn för =
är =
. kommutatorn för >
är <
och vice versa. Dokumentationen:
Matchningsoperatorn för reguljära uttryck ~
har ingen kommutator, igen, för det är inte möjligt. Se själv:
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
Jag har försökt tidigare och var tvungen att acceptera att det är omöjligt på rektor .