sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQL-復元されたデータベースが元のサイズよりも小さい

    簡単に言うと、データベースストレージはスペースよりも速度が最適化されています。

    たとえば、テーブルに100行を挿入し、奇数のIDを持つすべての行を削除した場合、DBMSは50行のみの新しいテーブルを書き出すことができますが、削除された行を単に空き領域としてマークする方が効率的です。次に行を挿入するときにそれらを再利用します。したがって、テーブルは現在必要なスペースの2倍のスペースを占有します。

    Postgresがトランザクション管理にロックではなく「MVCC」を使用すると、これがさらに起こりやすくなります。これは、UPDATEでは通常、新しい行をストレージに書き込み、トランザクションがそれを参照しなくなったら古い行を削除済みとしてマークするためです。

    データベースをダンプして復元することにより、この空き領域がまったくないDBを再作成することになります。これは基本的にVACUUM FULLです。 コマンドは実行します-現在のデータを新しいファイルに書き換えてから、古いファイルを削除します。

    pg_freespaceと呼ばれるPostgresで配布される拡張機能があります。 これにより、このいくつかを調べることができます。例えば以下に、メインテーブルのサイズ(個別の「TOAST」テーブルに格納されているインデックスと列を含まない)と各テーブルで使用される空き領域を一覧表示できます。

    Select oid::regclass::varchar as table,
          pg_size_pretty(pg_relation_size(oid)/1024 * 1024) As size,
          pg_size_pretty(sum(free)) As free
     From (
       Select c.oid,
           (pg_freespace(c.oid)).avail As free
         From pg_class c
         Join pg_namespace n on n.oid = c.relnamespace
        Where c.relkind = 'r'
          And n.nspname Not In ('information_schema', 'pg_catalog')
     ) tbl
     Group By oid
     Order By pg_relation_size(oid) Desc, sum(free) Desc;
    


    1. クエリでmysqlフルテキストストップワードを無視する

    2. 別のテーブルを参照するチェック制約を設定するにはどうすればよいですか?

    3. java.library.pathにocijdbc12がありません

    4. Mongoデータベースに画像ファイルを保存するのは良い考えですか?