2017-01-10 90 views
0

我想在PostgreSQL 8.2中找到死元組和表的活元組。我們剛剛開始使用基於PostgreSQL 8.2的Greenplum MPP數據庫系統。如何在PostgreSQL 8.2(for Greenplum)中找到死元組(碎片)?

由於默認的MVCC體系結構,我們需要找到一個表的死元組,並制定計劃將其變爲VACUUM。

我知道,如何在新版本的PostgreSQL中找到死元組。我已經分享了兩篇文章。

PostgreSQL: How to check Table Fragmentation using pgstattuple module

PostgreSQL: Script to find total Live Tuples and Dead Tuples (Row) of a Table

任何一個可以幫助我在這?

在此先感謝!

+1

如果它是基於PostgreSQL的8.2,它應該有自動清理。使用它,而不是試圖自己弄清楚。 –

+0

感謝您的回覆,是autovacuum在那裏,但我有很多表,每個大小約150GB。所以我也需要手動活動。 – Anvesh

+0

爲什麼?你不能配置autovacuum,以便它能滿足你的需求嗎? –

回答

3

請勿使用autovacuum。 Greenplum不是PostgreSQL,並且autovacuum在數據庫中不起作用。我強烈建議不要使用PostgreSQL標記Greenplum帖子,因爲您可能會得到不正確的信息。這就像發佈一個關於OSX的問題,並且標記BSD。

真空堆表與膨脹:

psql -t -A -c "SELECT E'VACUUM \"' || bdinspname || E'\".\"' || bdirelname || E'\";' FROM gp_toolkit.gp_bloat_diag WHERE bdinspname <> 'pg_catalog'" | psql -e 

但大多數都在您的Greenplum表的可能不會是堆它採用MVCC,而使用「附加優化」或AO的簡稱。它使用可見性映射來隱藏已刪除的行,並且文件更小,因此速度更快。它也允許表格被壓縮和列嚮導。

AO表還需要維護,但與堆表不同,它具有由gp_appendonly_compaction_threshold GUC控制的壓縮閾值。只要VACUUM所有AO表和數據庫將自動重建表,如果隱藏行的百分比超過10%。

Greenplum仍然遭受從PostgreSQL繼承的凍結年齡問題。這個腳本通常不會返回任何行,而是在較長時間沒有被觸摸的表格的較早安裝中,您可能會開始抽真空表格。

vacuum_freeze_min_age=$(psql -t -A -c "show vacuum_freeze_min_age;") 
psql -t -A -c "SELECT E'VACUUM \"' || n.nspname || E'\".\"' || c.relname || E'\";' FROM pg_class c join pg_namespace n ON c.relnamespace = n.oid WHERE age(relfrozenxid) > $vacuum_freeze_min_age AND c.relkind = 'r'" | psql -e 

當你在它的時候,你應該安排analyzeb來定期分析所有的表。例如:

analyzedb -d gpadmin -s tpcds 

別忘了目錄!

psql -t -A -c "SELECT E'VACUUM ANALYZE \"' || n.nspname || E'\".\"' || c.relname || E'\";' FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid WHERE n.nspname = 'pg_catalog' AND c.relkind = 'r'" | psql -e 

這重新索引目錄索引:

reindexdb -s 
+2

問題發佈後,我刪除了Postgres標籤,但Anvesh添加了它,我不想開始編輯戰爭 –

+0

感謝Jon,將檢查此解決方案並回復給您。也刪除了postgresql標籤。 – Anvesh