У меня есть таблица в PostgreSQL 9.2, которая имеет столбец text
. Позвольте называть это text_col
. Значения в этом столбце довольно уникальны (могут содержать не более 5-6 дубликатов). Таблица имеет ~ 5 миллионов строк. Около половины этих строк содержат значение null
для text_col
. Когда я выполняю следующий запрос, я ожидаю 1-5 строк. В большинстве случаев ( > 80%) я ожидаю только 1 строку.
Query
explain analyze SELECT col1,col2.. colN
FROM table
WHERE text_col = 'my_value';
A btree
индекс существует на text_col
. Этот индекс никогда не используется планировщиком запросов, и я не уверен, почему. Это результат запроса.
Планировщик
Seq Scan on two (cost=0.000..459573.080 rows=93 width=339) (actual time=1392.864..3196.283 rows=2 loops=1)
Filter: (victor = 'foxtrot'::text)
Rows Removed by Filter: 4077384
Я добавил еще один неполный индекс, чтобы попытаться отфильтровать те значения, которые не были нулевыми, но это не помогло (с или без text_pattern_ops
. Мне не нужно text_pattern_ops
, учитывая, что условия LIKE
выражены в моем запросов, но они также соответствуют равенству).
CREATE INDEX name_idx
ON table
USING btree
(text_col COLLATE pg_catalog."default" text_pattern_ops)
WHERE text_col IS NOT NULL;
Отключение сканирования последовательностей с помощью set enable_seqscan = off;
заставляет планировщик по-прежнему выбирать seqscan
поверх index_scan
. В итоге...
- Количество строк, возвращаемых этим запросом, невелико.
- Учитывая, что ненулевые строки довольно уникальны, сканирование индекса по тексту должно быть быстрее.
- Вакуумирование и анализ таблицы не помогли оптимизатору выбрать индекс.
Мои вопросы
- Почему база данных выбирает сканирование последовательности по сканированию индекса?
- Когда в таблице есть текстовый столбец, условие равенства которого должно быть проверено, существуют ли какие-либо рекомендации, к которым я могу присоединиться?
- Как сократить время, затрачиваемое на этот запрос?
[Изменить - Дополнительная информация]
- Сканирование индекса происходит в моей локальной базе данных, где хранится около 10% данных, доступных в процессе производства.