Pg+dSpam: zvyseni vykonu
Tomas Vondra
tv na fuzzy.cz
Středa Prosinec 14 15:16:37 CET 2011
On 14 Prosinec 2011, 15:02, Jan Kasprzak wrote:
> Tomas Vondra wrote:
> : A ještě jeden nápad - používá se na té velké tabulce HOT update? To může
> : databázi hodně ulehčit, tabulka a indexy nebobtnají apod. Pro zjištění
> : stačí dotaz:
> :
> : SELECT schemaname, relname,
> : n_tup_upd,n_tup_hot_upd,
> : case when n_tup_upd > 0
> : then
> : ((n_tup_hot_upd::numeric/n_tup_upd::numeric)*100.0)::numeric(5,2)
> : else NULL
> : end AS hot_ratio
> : FROM pg_stat_all_tables WHERE relname = 'tabulka';
> :
> : Čím vyšší hot_ratio, tím lepší (maximum je 100%). Problém je pokud v
> : blocích není místo (to jde řešit snížením fillfactoru), nebo pokud se
> : updatují indexované sloupce (to řešit nejde, leda úpravou dotazů).
>
> [...] FROM pg_stat_all_tables WHERE relname = 'dspam_token_data';
> schemaname | relname | n_tup_upd | n_tup_hot_upd | hot_ratio
> ------------+------------------+------------+---------------+-----------
> public | dspam_token_data | 2603655515 | 1924352211 | 73.91
No, to by asi šlo vylepšit ... jsou ty aktualizované sloupce indexované?
Pokud ne, můžete zkusit
ALTER TABLE tabulka SET (fillfactor = 90)
a ono to v nových blocích nechá 10% místa.
Poznamenejte si někam ty aktuální statistiky pro tabulku, ať se pak dá
porovnat nová úspěšnost. Bohužel existující bloky to nechá tak jak jsou -
musela by se reloadnout, což nevím jak je reálné (ale pokud na ní nejsou
navázány cizí klíče tak by to šlo udělat celkem jednoduše).
BTW jaký je poměr živých a mrtvých řádek?
SELECT n_live_tup, n_dead_tup
FROM pg_stat_all_tables
WHERE relname = 'dspam_token_data'
Pokud je tam hodně mrtvých (vzhledem k živým) tak je třeba to řešit (menší
tabulka se lépe vejde do cache apod.).
Tomáš
PS: Přijde mi to tu už dost offtopic - navrhuji pokračovat v českém
PostgreSQL listu (http://groups.google.com/group/postgresql-cz/).
Další informace o konferenci Linux