2016-02-01 4 views
0

У меня есть стол для людей. Я хочу посмотреть их, используя поле person_code, которое представляет собой буквенно-цифровую строку. Я создал индекс, как:PostgresSQL не использует индекс для подстановочных знаков

create index my_idx on persons(some_function(person_code)) 

Однако, когда я пытаюсь что-то вроде:

select * from persons where some_function(person_code) like 'mycode%' 

Я в конечном итоге, последовательное сканирование вместо индексного сканирования. Согласно Postgres index types documentation, LIKE должен использовать индекс, если шаблон соответствия является константой и привязан к началу строки.

Любые идеи о том, что я могу сделать неправильно?

+0

Он будет использовать индекс, если планировщик считает, что есть выгода используя индекс. Это зависит от количества строк, статистики таблицы, количества строк, которые, по его мнению, будут возвращены и т. Д. –

+3

Пожалуйста, добавьте план выполнения (используя 'explain (analysis, verbose)') как ** отформатированный ** текст на ваш вопрос –

+1

' some_function (person_code), например 'mycode%' 'Что такое some_function? Шансы большие, что функция * не может * использовать индекс, просто потому, что это функция. – wildplasser

ответ

0

Без EXPLAIN ANALYZE вашего запроса образца он будет жестким, чтобы помочь вам с вашей проблемой, но вы можете посмотреть на модуль herepg_trgm. Индекс образца для ILIKE/LIKE операций может быть следующей:

CREATE INDEX idx_persons_person_code_trgm ON person USING gin (person_code gin_trgm_ops); 

Статьи стоит проверка:

Смежные вопросы