3

heroku 管理の postgresql 9.2 データベース内のすべてのテーブルに対して手動のバキューム操作を実行する前と実行した後の肥大化したテーブルを次に示します。ご覧のとおり、あまり変化はなく、廃棄物が増えています...
その理由は何でしょうか? これは正常な動作ですか?

前:

 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
4

2 に答える 2

3

テーブルを最小サイズにパックする必要がある場合は、 を実行しますVACUUM FULLVACUUMテーブルの末尾を除いて、データ ページの圧縮やディスク領域の解放を試みません (これは安価な操作です)。

通常、plainVACUUMがはるかに好ましいアプローチです。無効なタプルが占有するスペースは、後の更新で再利用でき、更新された行バージョンはこの方法で同じデータ ページに書き込むことができます。すべてを密にパックすると、新しい行バージョンは常にテーブルの最後に追加する必要があります。ある程度のスラックは、一般に書き込みパフォーマンスを向上させます -読み取り専用テーブルを除いて、VACUUM FULL(1 回) またはCLUSTER.

クライアント プログラムvacuumdbには-f( --full) スイッチがあります。

バキューム処理に関する Postgres Wiki の詳細情報。

于 2013-10-02T15:58:56.653 に答える
2

Tl;dr バージョン: 奇妙に見えません。

行が更新または削除されると、mvcc は txid 以降の古い行を無効としてマークします。挿入と更新のために、その txid 以降に新しいものが挿入されます。

その後、自動バキュームが時折開始され、通常の DB 操作には問題ありません。

バキュームは、通常自動バキュームが定期的かつローカルに行うことを強制します。たとえば、大きな更新または削除の後にそれを実行します。

バキュームが行うことは、基本的に、ディスク ページから不要な行を削除することです。そして、私が間違っていない限り、いっぱいになったディスク ページを分割して将来の新しい行用に新しいスペースを作成する (テーブルのフィル ファクターから遠すぎるなど) か、空すぎるディスク ページをマージして不要なスペースを削除します (同じ理由)。

于 2013-10-02T15:37:40.180 に答える