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

From: Alexey Klyukin <alexk(at)commandprompt(dot)com>
To: silly_sad <sad(at)bankir(dot)ru>
Cc: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: COUNT(*) дофига весит
Date: 2008-04-17 07:37:33
Message-ID: 20080417073733.GA6868@vollmond
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-ru-general

silly_sad wrote:
> Alex Gorbachenko wrote:
>
>> silly_sad wrote:
> >> и не понял, каким образом автовакуум
> избавит меня от необходимости
> >> FULL вакуума ?
>
> > тем, что он всё сделает за вас. причём
> при правильных настройках на
> > производительности всего остального
> его работа не скажется.
>
> делает ли он за меня FULL ? или каким-то
> образом делает FULL ненужным?

Основное направление разработки - как раз сделать FULL
ненужным. По-сути обычный vacuum ничего не освобождает,
он просто отмечает свободное место в таблице, состоящее
из строк, которые уже не нужны (удалены и не видимы для
транзакций). Т.е. после вызова VACUUM на диске таблица
будет занимать столько же, сколько и до вызова, но дисковое
пространство будет расходоваться более эффективно.

>
>>> Объясните пожалуйста, в чем разница
>>> между авто и еженочным vaccuum
>>> analyze?
>> в том, что autovacuum проверяет количество
>> измененных
>> записей в таблицах, и запускается в
>> случае, если это количество некоего
>> числа. что позволяет "размазать" вакуум
>> по времени. по моему в
>> документации это написано довольно
>> подробно.
>
> Алгоритм запуска этой процедуры мне
> понятен.
> Мне непонятно каким образом частые
> вакуумы оказываются более эффективными
> в смысле очистки места чем ежесуточные.

Это достаточно просто показать на примере:
Представь, что у тебя таблица занимает
100 Мб, из нее удаляется 50 мегабайт строк,
после чего вставляется 100 мегабайт.

Если сделать vacuum после последней вставки
100 мегабайт, то таблица будет занимать 200
мегабайт на диске (при удалении 50 мегабайт
на самом деле никакого удаления не произошло,
просто соотв. строки были отмечены особенным
образом). Теперь во втором варианте, если вначале
после удаления 50мб сделать vacuum, а потом
вставить 100 мегабайт, то таблица будет занимать
(условно говоря) 150 мегабайт, т.к. место, связанное
с удаленными ячейками было отмечено командой vacuum
как свободное и последующая вставка 100 мегабайт получила
возможность его использовать.

>
> насколько я смог судить из документации
> автомат вызывает
> VACUUM.
> А меня сейчас спасает только VACUUM FULL
> (ежесуточного хватает).
> (Несколько таблиц очень интенсивно
> апдэйтятся)

Попробуй сделать более агрессивный vacuum analyze.
Вся прелесть autovacuum - в настраиваемых параметрах его работы,
как уже было сказано вместо того, чтобы запускать обычный
vacuum analyze _по_времени_ (например из cron-а) можно использовать
количество "устаревших" строк таблицы и затюнить autovacuum под
свои нужды. Вообще наиболее полно возможности autovacuum проявляются
в 8.3:
http://www.postgresql.org/docs/8.3/static/routine-vacuuming.html#AUTOVACUUM

--
Alexey Klyukin http://www.commandprompt.com/
The PostgreSQL Company - Command Prompt, Inc.

In response to

Browse pgsql-ru-general by date

  From Date Subject
Next Message Maxim Boguk 2008-04-17 07:51:46 Re: COUNT(*) дофига весит
Previous Message silly_sad 2008-04-17 07:24:32 Re: COUNT(*) дофига весит