Neexistuje .
Indexy vyžadují IMMUTABLE
výrazy. Výsledek vašeho výrazu závisí na vstupním řetězci. Nevidím jiný způsob, než vyhodnotit výraz pro každý řádek, což znamená sekvenční skenování.
Související odpověď s dalšími podrobnostmi pro IMMUTABLE
úhel:
Jen to, že pro váš případ neexistuje žádné řešení, což je nemožné indexovat. Index potřebuje ukládat konstantní hodnoty do svých n-tic, což prostě není k dispozici, protože výsledná hodnota pro každý řádek se vypočítává na základě vstupu. A nemůžete transformovat vstup, aniž byste se podívali na hodnotu sloupce.
Použití indexu Postgres je vázáno na operátory a indexuje pouze na výrazech vlevo operátora lze použít (kvůli stejným logickým omezením). Více:
Mnoho operátorů definuje COMMUTATOR
což umožňuje plánovači / optimalizátoru dotazů otočit indexované výrazy doleva. Jednoduchý příklad:komutátor =
je =
. komutátor >
je <
a naopak. Dokumentace:
Operátor shody regulárního výrazu ~
opět nemá komutátor, protože to není možné. Podívejte se sami:
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
Zkoušel jsem to již dříve a musel jsem se smířit s tím, že je to z principu nemožné .