Re: COUNT(*) дофига весит

Поиск
Список
Период
Сортировка
От silly_sad
Тема Re: COUNT(*) дофига весит
Дата
Msg-id 47FD9706.3090705@bankir.ru
обсуждение исходный текст
Ответ на Re: COUNT(*) дофига весит  (Maxim Boguk <mboguk@masterhost.ru>)
Список pgsql-ru-general
Спасибо,
будем исправлять.

Maxim Boguk wrote:
>>> 4)Что показывает SELECT pg_relation_size('accounts');
>>
>>  pg_relation_size
>> ------------------
>>         353107968
>
> 350mb для таблицы в 1700 записей это как то грустно.
> Таблица распухла раз в 100-1000 (точнее будет ясно после vacuum full)
> сканировать 350mb всегда медленно (даже если это на 99% пустое место).
>
>
>
>>> 6)Нету ли старых открытых транзакций (более 24х часов скажем)?
>>
>> Была одна. (как могло влиять ?)
>> Закрыл. (что надо сделать чтобы это возымело эффект?)
>
> Открытая транзакция не дает возможность базе после vacuum повторно
> использовать пустое место.
> Так что если транзакция длинная а поток обновлений большой то таблица
> может пухнуть до бесконечности.
>
> Советы:
> 1)Настроить autovacuum (ночной vacuum analyze не самое удачное решение)
> (http://www.postgresql.org/docs/8.2/interactive/routine-vacuuming.html#AUTOVACUUM)
>
> и отключить ночные vacuum
> 2)любой ценой избегать длинных (более 1-2-3 часов транзакций)
>
> Конкретно с этой таблицей на нее надо сделать:
> vacuum full analyze accounts;
> после чего ее размер вернется к норме и скорость count(*) станет выше.
> (только надо не забывать что vacuum full блокирует любые операции с
> таблицей включая select и может работать заметное время).
>
>
>>>> Подскажите пожалуйста какие ошибки
>>>> (можетбыть в настройках постгреса)
>>>> могли привести вот к такому эффекту:
>>>>
>>>> personal=# explain ANALYZE SELECT count(*) from accounts;
>>>>
>>>>                      QUERY PLAN
>>>> -------------------------------------------------------------
>>>>  Aggregate  (cost=43126.25..43126.26 rows=1 width=0) (actual
>>>> time=975.628..975.628 rows=1 loops=1)
>>>>    ->  Seq Scan on accounts  (cost=0.00..43121.80 rows=1780 width=0)
>>>> (actual time=0.122..974.565 rows=1782 loops=1)
>>>>  Total runtime: 975.687 ms
>>>>
>>>>
>>>> personal=# SELECT count(*) from accounts;
>>>>
>>>>  count
>>>> -------
>>>>   1782
>>>>
>>>>
>>>> Всего-то 1782 записи ! и такая огромная цена.
>>>> и реальное время выполнения тоже неприемлемое.
>>>>
>>>> vacuum analyze делается каждую ночь
>>>>
>>>
>>>
>>
>>
>
>


В списке pgsql-ru-general по дате отправления:

Предыдущее
От: Maxim Boguk
Дата:
Сообщение: Re: COUNT(*) дофига весит
Следующее
От: silly_sad
Дата:
Сообщение: Re: COUNT(*) дофига весит