sql >> Databasteknik >  >> RDS >> PostgreSQL

Finns det ett sätt att på ett användbart sätt indexera en textkolumn som innehåller regexmönster?

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

Och se manualen här:

Jag har försökt tidigare och var tvungen att acceptera att det är omöjligt på rektor .




  1. Hur OBJECTPROPERTYEX() fungerar i SQL Server

  2. Automatisk ökning på partiell primärnyckel med Entity Framework Core

  3. Postgres - konvertera en enkel tabell i ett grupperat JSON-träd

  4. Visa (lista) MySQL-databaser på Linux via kommandoraden