Инструментът за планиране на заявки PostgreSQL е умен, но не е AI. За да го направите, използвайте индекс на израз използвайте точно същата форма на изразяване в заявката.
С индекс като този:
CREATE INDEX t_a_lower_idx ON t (lower(substring(a, 1, 4)));
Или по-просто в PostgreSQL 9.1:
CREATE INDEX t_a_lower_idx ON t (lower(left(a, 4)));
Използвайте тази заявка:
SELECT * FROM t WHERE lower(left(a, 4)) = 'abcd';
Което е 100% функционално еквивалентно на:
SELECT * FROM t WHERE lower(a) LIKE 'abcd%'
Или:
SELECT * FROM t WHERE a ILIKE 'abcd%'
Ноне :
SELECT * FROM t WHERE a LIKE 'abcd%'
Това е функционално различна заявка и имате нужда от разлица индекс:
CREATE INDEX t_a_idx ON t (substring(a, 1, 4));
Или по-просто с PostgreSQL 9.1:
CREATE INDEX t_a_idx ON t (left(a, 4));
И използвайте тази заявка:
SELECT * FROM t WHERE left(a, 4) = 'abcd';
Ляво закотвени думи за търсене с променлива дължина
Регистърът не е чувствителен. Индекс:
Редактиране :Почти забравих:Ако стартирате своя db с локал, различен от 'C' по подразбиране, трябва да изрично посочете операторния клас
- text_pattern_ops
в моя пример:
CREATE INDEX t_a_lower_idx
ON t (lower(left(a, <insert_max_length>)) text_pattern_ops);
Заявка:
SELECT * FROM t WHERE lower(left(a, <insert_max_length>)) ~~ 'abcdef%';
Може да използва индекса и е почти толкова бърз, колкото варианта с фиксирана дължина.
Може да се интересувате от тази публикация в dba.SE с повече подробности относно съвпадението на шаблон
, особено последната част за операторите ~>=~
и ~<~
.