Не могли бы вы дать нам больше информации о таблицах (статистике) и конфигурации?
SELECT version();
SELECT category, name, setting FROM pg_settings WHERE name IN('effective_cache_size', 'enable_seqscan', 'shared_buffers');
SELECT * FROM pg_stat_user_tables WHERE relname IN('cell_forum_topic', 'cell_forum_item');
SELECT * FROM pg_stat_user_indexes WHERE relname IN('cell_forum_topic', 'cell_forum_item');
SELECT * FROM pg_stats WHERE tablename IN('cell_forum_topic', 'cell_forum_item');
И прежде чем получать эти данные, используйте ANALYZE.
Похоже, у вас проблема с индексом, вот где весь запрос тратит все свое время:
-> Сканирование индекса с помощью cell_forum_item_idx_skyid on
cell_forum_item (стоимость = 0.00..1434.22
ряды = 1520 ширина = 4) (фактический
время = 302,378.,15429,782 строк = 7133
петли = 1)
Если вы используете VACUUM FULL на регулярной основе (НЕ РЕКОМЕНДУЕТСЯ!), Проблема может быть в раздувании индекса. REINDEX может быть хорошей идеей, просто чтобы быть уверенным:
REINDEX TABLE cell_forum_item;
А если говорить об индексах, вы можете отбросить пару из них, они устарели:
"idx_cell_forum_topic_6" btree (categoryid, settop, hidden, restoretime)
"idx_cell_forum_topic_3" btree (categoryid, hidden, restoretime)
Другие индексы имеют те же данные и могут использоваться базой данных.
Похоже, у вас есть пара проблем:
- автовакуум выключен или работает
позади. Последний автовакуум был включен
2010-12-02 и у вас 256734 мертвых
кортежи в одном столе и 451430 мертвых
одни в другой .... надо делать
что-то об этом, это
серьезная проблема.
- Когда автовакуум снова работает, вы
должен сделать ВАКУУМ ПОЛНЫЙ и
REINDEX, чтобы заставить таблицу переписать и
избавиться от всего пустого пространства в вашем
таблицы.
- после устранения проблемы с вакуумом вы
надо также анализировать: база данных
ожидает 1520 результатов, но получает 7133
Результаты. Это может быть проблемой с
статистика, может быть, вам придется
увеличить СТАТИСТИКА .
- Сам запрос нуждается в переписывании
а также: он получает 7133 результатов, но это
нужно всего 610 результатов. Более 90%
результаты теряются ... и получать
эти 7133 занимают много времени, более
15 секунд Избавьтесь от подзапроса, используя JOIN без GROUP BY или EXISTS, также без GROUP BY.
Но сначала включите автоочистку, пока не возникли новые или другие проблемы.