1. 程式人生 > >postgresql之vacuum

postgresql之vacuum

資料庫總是不斷地在執行刪除,更新等操作。良好的空間管理非常重要,能夠對效能帶來大幅提高。

在postgresql中用於維護資料庫磁碟空間的工具是VACUUM,其重要的作用是刪除那些已經標示為刪除的資料並釋放空間。

定期vacuum是一個重要的工作,原因在於以下3點:

1. 釋放,再利用 更新/刪除的行所佔據的磁碟空間;

2. 更新PostgreSQL查詢計劃中使用的統計資料;

3. 防止因事務ID的重置而使非常老的資料丟失。

VACUUM語法結構:

VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ table ]

VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] ANALYZE [ table [ (column [, ...] ) ] ]

postgresql中執行delete操作後,表中的記錄只是被標示為刪除狀態,並沒有釋放空間,在以後的update或insert操作中該部分的空間是不能夠被重用的。

經過vacuum清理後,空間才能得到釋放。

可惜的是vacuum工具不能夠對相應的索引進行清理,唯一的辦法就是手動去重建相應索引

Full Vacuum

full vacuum與單純的vacuum還是有很大的區別的。vacuum只是將刪除狀態的空間釋放掉,轉換到能夠重新使用的狀態,但是對於系統來說該資料塊的空閒空間並沒有反應到系統的元資料中。類似oracle中高水位標記並沒有下降。Full vacuum將會使空間釋放的資訊表現在系統級別,其實質是將當前刪除記錄後面的資料進行移動,使得整體的記錄連貫起來,降低了

高水位標記

Vacuum analyze

analyze的功能是更新統計資訊,使得優化器能夠選擇更好的方案執行sql。

oracle中同樣作用也相同,目前更多的使用也有analyze,的是dbms_stats包。統計資訊收集和更新對於系統性能來說非常重要,與oracle維護類似,通常可以通過採用手動或者定製任務的方式。也有不同,oracle在進行imp後自動的對相應資料物件進行統計資訊的收集和更新,而postgresql的恢復過程還沒有整合到裡面,需要手動去執行。

具體如何如何執行!

autovacuum相關引數

autovacuum:預設為on,表示是否開起autovacuum。預設開起。特別的,當需要凍結xid時,儘管此值為off,PG也會進行vacuum。 

autovacuum_naptime:下一次vacuum的時間,預設10min。 這個naptime會被vacuum launcher分配到每個DB上。autovacuum_naptime/num of db。 

log_autovacuum_min_duration:記錄autovacuum動作到日誌檔案,當vacuum動作超過此值時。 “-1”表示不記錄。“0”表示每次都記錄。 

autovacuum_max_workers:最大同時執行的worker數量,不包含launcher本身。 

autovacuum_work_mem:每個worker可使用的最大記憶體數。

autovacuum_vacuum_threshold:預設50。與autovacuum_vacuum_scale_factor配合使用, autovacuum_vacuum_scale_factor預設值為20%。當update,delete的tuples數量超過autovacuum_vacuum_scale_factor*table_size+autovacuum_vacuum_threshold時,進行vacuum。如果要使vacuum工作勤奮點,則將此值改小。 

autovacuum_analyze_threshold:預設50。與autovacuum_analyze_scale_factor配合使用, autovacuum_analyze_scale_factor預設10%。當update,insert,delete的tuples數量超過autovacuum_analyze_scale_factor*table_size+autovacuum_analyze_threshold時,進行analyze。 

autovacuum_freeze_max_age和autovacuum_multixact_freeze_max_age:前面一個200 million,後面一個400 million。離下一次進行xid凍結的最大事務數。 

autovacuum_vacuum_cost_delay:如果為-1,取vacuum_cost_delay值。 

autovacuum_vacuum_cost_limit:如果為-1,到vacuum_cost_limit的值,這個值是所有worker的累加值。

更改系統autovacuum相關引數

ALTER SYSTEM SET autovacuum_vacuum_scale_factor = 0.03;

ALTER SYSTEM SET autovacuum_analyze_scale_factor = 0.03;

ALTER SYSTEM SET autovacuum_vacuum_threshold = 30;

ALTER SYSTEM SET autovacuum_analyze_threshold = 30;

select pg_reload_conf ();

更改單表autovacuum相關引數

alter table tccpu_tempre set (autovacuum_vacuum_scale_factor=.03);

檢視單表引數

SELECT n.nspname, c.relname, pg_catalog.array_to_string(c.reloptions || array( select 'toast.' || x from pg_catalog.unnest(tc.reloptions) x),', ') as relopts 

FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_class tc ON (c.reltoastrelid = tc.oid) JOIN pg_namespace n ON c.relnamespace = n.oid 

WHERE c.relkind = 'r' AND nspname NOT IN ('pg_catalog', 'information_schema') 

and pg_catalog.array_to_string(c.reloptions || array( select 'toast.' || x from pg_catalog.unnest(tc.reloptions) x),', ') <>'';

by 波羅