Používám PostgreSQL 9.1 na Ubuntu. Jsou naplánovány VACUUM ANALYZE
stále se doporučuje, nebo je autovakumát dostatečně postaráno o všechny potřeby?
Pokud je odpověď „záleží“, pak:
Ptám se, protože naplánované VACUUM ANALYZE
má vliv na mé hlášení. Trvá to déle než 5 hodin a musel jsem to zabít dvakrát tento týden, protože to mělo dopad na pravidelné importování databáze. check_postgres
nehlásí žádné významné nadýmání v databázi, takže to ve skutečnosti není problém.
Z dokumentů by se autovacuum mělo postarat také o obal ID transakcí. Otázka zní: Potřebuji ještě VACUUM ANALYZE
?
VACUUM je potřeba pouze u aktualizovaných nebo odstraněných řádků v dočasných tabulkách. Je zřejmé, že děláte spoustu INSERTů, ale z popisu není patrné, že také děláte spoustu UPDATE nebo DELETE.
Tyto operace lze sledovat pomocí pg_stat_all_tables
view, konkrétně n_tup_upd
a n_tup_del
sloupců. A ještě více je zde n_dead_tup
sloupec, který podle tabulky uvádí, kolik řádků je třeba vysát. (viz Statistiky monitorování v dokumentu týkající se funkcí a pohledů souvisejících se shromažďováním statistik).
Možnou strategií ve vašem případě by bylo potlačení plánovaného VACUUM, sledování tohoto pohledu a kontrola, na kterých tabulkách je n_dead_tup
výrazně stoupá. Potom aplikujte agresivní VACUUM pouze na tyto tabulky. To bude vítězství, pokud existují velké tabulky, jejichž řádky se nikdy neodstraní ani neaktualizují a agresivní VACUUM je opravdu nutné pouze na menších stolech.
Ale pokračujte v analýze ANALYZE, aby optimalizátor měl vždy čerstvé statistiky.
Ve vaší otázce nevidím nic, o co by se autovacuum
nestaral. Z velké části to závisí na vzorci vašich písemných aktivit . Zmíníte 3 miliony nových řádků týdně, ale INSERT
(nebo COPY
) obvykle nevytvářejí nadýmání tabulek a indexů. (autovacuum
se musí starat pouze o statistika sloupců , mapa viditelnosti a některé menší úlohy). UPDATE
a DELETE
jsou dominantní příčinou nadýmání tabulek a indexů, zejména při cílení na náhodné řádky. Ve vaší otázce nic z toho nevidím.
autovacuum
prošel dlouhou cestu a dělá skvělou práci v Postgres 9.1 nebo novější. Podíval bych se na nastavení autovacuum
. Pokud má vysávání tendenci narušovat vaši pracovní zátěž, podívejte se také na „Nákladové zpoždění vakua“ . Manuální vysávání by mělo být vzácnou výjimkou.
Pokud máte spoustu náhodných UPDATE
s, možná budete chtít nastavit FILLFACTOR
na něco menšího než 100, abyste mohli HOT aktualizace okamžitě a snížit potřebu VACUUM
. Více o HOT aktualizacích:
Také si všimněte, že dočasné tabulky vyžadují manuální VACUUM
& ANALYZE
. Cituji příručka k CREATE TABLE
:
autovacuum daemon nemůže získat přístup, a proto nemůže vysát ani analyzovat dočasné tabulky. Z tohoto důvodu by měly být prováděny vhodné operace vakua a analýzy pomocí příkazů SQL relace. Pokud se například dočasná tabulka použije ve složitých dotazech, je rozumné spustit po dočasné naplnění
ANALYZE
v dočasné tabulce.
Přestože souhlasím s tím, že použití automatických funkcí je nejlepší místo toho, aby byla spuštěna celá databáze, ve většině případů je nutné vyladění podle tabulky.
Nesouhlasím s návrhem výběru postgresu, který by spojil vakuum a analýzu, viděl jsem několik případů, kdy databáze, které provádějí mnoho vkládání/aktualizací, ale malé mazání, nikdy neprovádějí analýzu a nezačnou hrát špatně.
Řešením je přejít do tabulek, které se intenzivně využívají a jsou předmětem velkých dotazů, a nastavit nastavení automatické analýzy pro tyto tabulky na něco, na co se analyzují jednou nebo každý druhý den.
K nastavení jednotlivých tabulek se dostanete v grafu na kartě auto vakua a uvidíte tam analýzu nastavení, která můžete nastavit nezávisle na vakuu.
Nastavení končí v tabulce relopcí a lze jej zobrazit pomocí dotazu
SELECT c.relname, c.reloptions FROM pg_class c where reloptions is not null
a tam může být ukázková hodnota agresivní analýzy
{autovacuum_enabled=true,autovacuum_analyze_threshold=10,autovacuum_analyze_scale_factor=.01}
Chcete-li zjistit, kdy byl váš stůl naposledy analyzován automaticky analyzovaným dotazem
select
relname,
n_dead_tup,
n_tup_ins,
n_tup_upd,
n_tup_del,
last_autoanalyze,
autoanalyze_count
from pg_stat_user_tables
where last_autoanalyze is not null
order by last_autoanalyze desc;