De PostgreSQL-queryplanner is slim, maar geen AI. Om het een index voor een uitdrukking te laten gebruiken gebruik de exact dezelfde uitdrukkingsvorm in de zoekopdracht.
Met een index als deze:
CREATE INDEX t_a_lower_idx ON t (lower(substring(a, 1, 4)));
Of eenvoudiger in PostgreSQL 9.1:
CREATE INDEX t_a_lower_idx ON t (lower(left(a, 4)));
Gebruik deze zoekopdracht:
SELECT * FROM t WHERE lower(left(a, 4)) = 'abcd';
Dat is 100% functioneel equivalent aan:
SELECT * FROM t WHERE lower(a) LIKE 'abcd%'
Of:
SELECT * FROM t WHERE a ILIKE 'abcd%'
Maar niet :
SELECT * FROM t WHERE a LIKE 'abcd%'
Dit is een functioneel andere zoekopdracht en je hebt een andere . nodig index:
CREATE INDEX t_a_idx ON t (substring(a, 1, 4));
Of eenvoudiger met PostgreSQL 9.1:
CREATE INDEX t_a_idx ON t (left(a, 4));
En gebruik deze vraag:
SELECT * FROM t WHERE left(a, 4) = 'abcd';
Links verankerde zoektermen van variabele lengte
Hoofdletter ongevoelig. Index:
Bewerken :Bijna vergeten:als u uw db uitvoert met een andere landinstelling dan de standaard 'C', moet u geef expliciet de operatorklasse op
- text_pattern_ops
in mijn voorbeeld:
CREATE INDEX t_a_lower_idx
ON t (lower(left(a, <insert_max_length>)) text_pattern_ops);
Vraag:
SELECT * FROM t WHERE lower(left(a, <insert_max_length>)) ~~ 'abcdef%';
Kan de index gebruiken en is bijna net zo snel als de variant met een vaste lengte.
Mogelijk bent u geïnteresseerd in deze post op dba.SE met meer details over patroonovereenkomst
, vooral het laatste deel over de operators ~>=~
en ~<~
.