2012-12-13 5 views
4

Существует несколько обсуждений этого и там (включая официальный пост в сети postgres) о медленном подсчете (*) предыдущей версии 9.2; как-то я не нашел удовлетворенного ответа.Медленный счет (*) on postgresql 9.2

В основном я был Postgres установлен 9,1, и я наблюдал медленное COUNT (*), как просто, как

select count(*) from restaurants; 

таблиц с записями 100k +. Средний запрос составляет около 850 мс. Хорошо, я предположил, что это был тот симптом, о котором люди говорили за медленный подсчет постгрейсов 9.1 и ниже, поскольку postgres 9.2 имеет некоторые новые функции, такие как только для индексации. Я хочу поэкспериментировать, используя тот же набор данных из 9.1 и поместив его на 9.2. Я вызываю счетчик, и он все равно дает плохой результат как 9.1.

explain analyze select count(*) from restaurants; 
------------------------------------------------------------------ 
Aggregate (cost=23510.35..23510.36 rows=1 width=0) (actual time=979.960..979.961 rows=1 loops=1) 
    -> Seq Scan on restaurants (cost=0.00..23214.88 rows=118188 width=0) (actual time=0.050..845.097 rows=118188 loops=1) 
Total runtime: 980.037 ms 

Может ли кто-нибудь предложить приемлемое решение этой проблемы? Нужно ли настраивать что-либо в postgres, чтобы включить эту функцию?

P.S. , где статья также не помогает в моем случае.

+3

Вы читали https://wiki.postgresql.org/wiki/Index-only_scans? Там обсуждается «счет» и ограничения вокруг него. Есть ли первичный ключ в этой таблице? Вы «ВАКУУМ» и «АНАЛИЗ» стол после загрузки данных? –

+0

Кроме того, что вы задали для 'random_page_cost' и' seq_page_cost'? Как насчет 'effective_cache_size'? –

+0

Спасибо Крэйгу за ссылку. Я прочитал его и сделал ВАКУУМ, как вы предложили, и как-то он улучшает скорость от 850 мс до 400 мс. Еще 400 мс - дорогое время. Есть ли какие-то дополнительные настройки, чтобы уточнить это? – Ream

ответ

2

См индекс сканирует только записи вики:

В частности, я цитирую:

Важно реак что планировщик занимается , сводя к минимуму общую стоимость запроса. В базах данных обычно доминирует стоимость . По этой причине «count (*) без каких-либо предикатов» запросы будут использовать только сканирование только индекса, если индекс значительно меньше его таблицы. Обычно это происходит, когда ширина строки таблицы намного шире, чем некоторые индексы.

См. Также обсуждение VACUUM и ANALYZE для сохранения карты видимости. По сути, вы, вероятно, захотите сделать более агрессивным VACUUM, и вам нужно вручную загрузить таблицу после ее первой загрузки VACUUM ANALYZE.