Няма начина .
Индексите изискват IMMUTABLE
изрази. Резултатът от вашия израз зависи от входния низ. Не виждам друг начин освен да оценя израза за всеки ред, което означава последователно сканиране.
Свързан отговор с повече подробности за IMMUTABLE
ъгъл:
Просто няма решение за вашия случай, което е невъзможно за индексиране. Индексът трябва да съхранява постоянни стойности в своите кортежи, което просто не е налично, тъй като получената стойност за всеки ред се изчислява въз основа на входа. И не можете да трансформирате входа, без да погледнете стойността на колоната.
Използването на индекс на Postgres е обвързано с оператори и индексира само изрази left на оператора може да се използва (поради същите логически ограничения). Още:
Много оператори дефинират 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
Опитвал съм преди и трябваше да приема, че е невъзможно за принципал .