2013-10-02 36 views
3

以下是在heroku管理的postgresql 9.2數據庫的所有表上運行手動真空操作之前和之後的頂級臃腫表。正如你所看到的,沒有太大的變化,有些浪費甚至增加了...
原因是什麼?這是正常的行爲嗎?postgres真空不會改變臃腫

前:

type | schemaname |  object_name  | bloat | waste 
-------+------------+------------------------+-------+------------ 
index | public  | table_1    | 1.4 | 113 MB 
table | public  | table_2    | 1.1 | 92 MB 
table | public  | table_3    | 1.1 | 70 MB 
index | public  | table_4    | 1.2 | 66 MB 
index | public  | table_5    | 1.2 | 65 MB 
index | public  | table_6    | 1.2 | 64 MB 
index | public  | table_7    | 1.1 | 34 MB 
table | public  | table_8    | 1.1 | 19 MB 

後:

type | schemaname |  object_name  | bloat | waste 
-------+------------+------------------------+-------+------------ 
index | public  | table_1    | 1.4 | 123 MB 
table | public  | table_2    | 1.1 | 82 MB 
table | public  | table_3    | 1.1 | 82 MB 
index | public  | table_4    | 1.3 | 72 MB 
index | public  | table_5    | 1.3 | 72 MB 
index | public  | table_6    | 1.3 | 71 MB 
index | public  | table_7    | 1.1 | 39 MB 
table | public  | table_8    | 1.1 | 19 MB 
+0

你可以用'真空FULL'收縮表,以最小尺寸,但效果將會是暫時性的。另外不要忘記吸塵指數。 –

回答

2

鉈;博士版本:看起來並不奇怪。

當行被更新或刪除時,mvcc將舊行標記爲從txid開始已經死亡;爲了插入和更新插入一個新的插件。

自動真空然後有時踢,並且對於正常的DB操作是正常的。

真空迫使週期性和本地自動真空通常會發生。比如,你會在重大更新或刪除之後運行它。

真空吸塵器的功能基本上是修剪磁盤頁面中的死行。而且,除非我誤解了,否則通過拆分太滿的磁盤頁面(如離表格的填充因子太遠)爲未來的新行創建新的空間,或通過合併太空的磁盤頁面來刪除不必要的空間(用於同樣的原因)。

3

如果您需要將表格打包爲最小尺寸,請運行VACUUM FULLVACUUM不會嘗試壓縮數據頁面或釋放磁盤空間,除非從表格的末尾(這是一種便宜的操作)。

通常,VACUUM是最好的方法。死元組佔用的空間可以在以後的更新中重用,更新後的行版本可以用這種方式寫入同一個數據頁面。如果你將所有東西緊緊包裝,新的行版本總是必須附加到表格的末尾。一些鬆懈一般改善寫性能 - 除了只讀表,這將是VACUUM FULL(一次)或甚至CLUSTER候選人。

客戶端程序vacuumdb-f--full)開關。

Much more information in the Postgres Wiki on vacuuming.