Всем привет!
Есть проблема у меня:
В базе живет две таблицы:
client ( ntel int4, ...)
billing ( ntel int4, ...)
По полям ntel созданы индексы
CREATE INDEX client_ntel ON client ( ntel );
CREATE INDEX billing_ntel ON billing ( ntel );
В таблице клиентов 14000 записей.
В биллинге - 1100000 записей.
Запрос для таблицы клиентов отрабатывает мгновенно
SELECT * FROM client WHERE ntel=549821;
test=# EXPLAIN SELECT * FROM client WHERE ntel=549821;
NOTICE: QUERY PLAN:
Index Scan using ntel on client (cost=0.00..6.86 rows=1 width=91)
Т.е. индекс используется - все путем.
Для таблицы биллинга подобный запрос приводит к полному сканированию:
test=# EXPLAIN SELECT ntel FROM billing WHERE ntel=532452;
NOTICE: QUERY PLAN:
Seq Scan on billing (cost=0.00..28597.41 rows=370 width=8)
Запрос, соответственно, выполняется 50-100 сек.
VACUUM ANALYZE billing результата не дает.
Ткните носом - где копать?
Николай.
Измени настройки сервера - раскомментируй enable_indexscan=true и закомментируй, если надо, enable_seqscan
Мне, по крайней мере, помогло. А еще я наблюдал, что пгре может забыть про индексы в зависимости от того, как ты составишь запрос, а его, сам понимаешь, можно составить как душа пожелает.
Проблему решил следующим образом.
1. Удалил таблицу.
2. В файле конфигурации выставил enable_indexscan=true, enable_seqscan=false
3. Создал таблицу, создал индексы
4. Залил данные
После этого все пошло.