Er is geen manier .
Indexen vereisen IMMUTABLE
uitdrukkingen. Het resultaat van uw expressie hangt af van de invoertekenreeks. Ik zie geen andere manier dan de uitdrukking voor elke rij te evalueren, wat een sequentiële scan betekent.
Gerelateerd antwoord met meer details voor de IMMUTABLE
hoek:
Alleen dat er geen oplossing is voor uw geval, wat onmogelijk is indexeren. De index moet constante waarden opslaan in zijn tuples, wat gewoon niet beschikbaar is omdat de resulterende waarde voor elke rij wordt berekend op basis van de invoer. En je kunt de invoer niet transformeren zonder naar de kolomwaarde te kijken.
Het gebruik van de Postgres-index is gebonden aan operators en alleen indexen op uitdrukkingen links van de operator kan worden gebruikt (vanwege dezelfde logische beperkingen). Meer:
Veel operators definiëren een COMMUTATOR
waarmee de queryplanner/optimizer de geïndexeerde expressies naar links kan draaien. Eenvoudig voorbeeld:De commutator van =
is =
. de commutator van >
is <
en vice versa. De documentatie:
De overeenkomstoperator voor reguliere expressies ~
heeft geen commutator, nogmaals, want dat is niet mogelijk. Overtuig uzelf:
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
En raadpleeg hier de handleiding:
Ik heb het eerder geprobeerd en moest accepteren dat het onmogelijk is in principe .