sql >> Database >  >> RDS >> PostgreSQL

Is er een manier om een ​​tekstkolom met regex-patronen nuttig te indexeren?

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 .




  1. Oracle ODBC:SQLAllocHandle van stuurprogramma op SQL_HANDLE_ENV is mislukt

  2. ORA-00979 geen groep op uitdrukking

  3. Ongeldige algemene gebruikers- of rolnaam

  4. Verbinding maken met een MySQL-gegevensbron in Visual Studio