LINUX.ORG.RU

Производительность Postgres


0

0

Всем привет!

Есть проблема у меня:

В базе живет две таблицы:
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 Мне, по крайней мере, помогло. А еще я наблюдал, что пгре может забыть про индексы в зависимости от того, как ты составишь запрос, а его, сам понимаешь, можно составить как душа пожелает.

NewComer
()

Изменение enable_indexscan и enable_seqscan не помогает.
Такое впечатление, что если в поле не уникальные значения, то индекс не используется.
???

nicko
() автор топика

Проблему решил следующим образом.

1. Удалил таблицу.
2. В файле конфигурации выставил enable_indexscan=true, enable_seqscan=false
3. Создал таблицу, создал индексы
4. Залил данные

После этого все пошло.


nicko
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.