5

PostgreSQL バージョン 9.1 で実行しています。以前は 1 つのテーブルに 10 億行以上あり、削除されました。ただし、\l+コマンドは実際のデータベース サイズについてまだ不正確に報告しているようです (568GB と報告されましたが、実際にはそれよりもはるかに小さいです)。

568GB が間違っていることの証明は、個々のテーブル サイズの合計が数字に合わないことです。上位 20 のリレーションのサイズは 4292MB で、残りの 985 のリレーションはすべて 10MB をはるかに下回っています。実際、それらすべてを合計すると約 6GB 未満になります。

なぜ PostgreSQL がこれほど肥大化しているのか、何か考えはありますか? 確認された場合、どうすれば膨張を解消できますか? 私は にあまり詳しくVACUUMありません。それは私がする必要があることですか? もしそうなら、どのように?

とても感謝しています。

pmlex=# \l+
                                                                       List of databases
      Name       |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   |  Size   | Tablespace |                Description                 
-----------------+----------+----------+-------------+-------------+-----------------------+---------+------------+--------------------------------------------
 pmlex           | pmlex    | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 568 GB  | pg_default | 
 pmlex_analytics | pmlex    | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 433 MB  | pg_default | 
 postgres        | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 5945 kB | pg_default | default administrative connection database
 template0       | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +| 5841 kB | pg_default | unmodifiable empty database
                 |          |          |             |             | postgres=CTc/postgres |         |            | 
 template1       | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +| 5841 kB | pg_default | default template for new databases
                 |          |          |             |             | postgres=CTc/postgres |         |            | 
(5 rows)

pmlex=# SELECT nspname || '.' || relname AS "relation",
pmlex-#     pg_size_pretty(pg_relation_size(C.oid)) AS "size"
pmlex-#   FROM pg_class C
pmlex-#   LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
pmlex-#   WHERE nspname NOT IN ('pg_catalog', 'information_schema')
pmlex-#   ORDER BY pg_relation_size(C.oid) DESC;
              relation               |  size   
-------------------------------------+---------
 public.page_page                    | 1289 MB
 public.page_pageimagehistory        | 570 MB
 pg_toast.pg_toast_158103            | 273 MB
 public.celery_taskmeta_task_id_key  | 233 MB
 public.page_page_unique_hash_uniq   | 140 MB
 public.page_page_ad_text_id         | 136 MB
 public.page_page_kn_result_id       | 125 MB
 public.page_page_seo_term_id        | 124 MB
 public.page_page_kn_search_id       | 124 MB
 public.page_page_direct_network_tag | 124 MB
 public.page_page_traffic_source_id  | 123 MB
 public.page_page_active             | 123 MB
 public.page_page_is_referrer        | 123 MB
 public.page_page_category_id        | 123 MB
 public.page_page_host_id            | 123 MB
 public.page_page_serp_id            | 121 MB
 public.page_page_domain_id          | 120 MB
 public.celery_taskmeta_pkey         | 106 MB
 public.page_pagerenderhistory       | 102 MB
 public.page_page_campaign_id        | 89 MB
...
...
...
 pg_toast.pg_toast_4354379           | 0 bytes
(1005 rows)
4

2 に答える 2

3

オプションは次のとおりです。

1)。自動バキュームが有効になっており、積極的に設定されていることを確認します。

2)。以前のコメントで述べたように、テーブルを再作成します (create-table-as-select + truncate + 元のテーブルをリロードします)。

3)。そのテーブルからロックアウト (排他ロック) する余裕がある場合は、そのテーブルで CLUSTER を実行します。

4)。VACUUM FULL、ただし CLUSTER の方が効率的で推奨されます。

5)。単純な VACUUM ANALYZE を数回実行し、テーブルをそのままにして、最終的に新しいデータが入ってくるとスペースを埋めます。

6)。pg_dump を介してテーブルをダンプしてリロードします

7)。pg_repack (本番環境では使用していませんが)

于 2013-08-08T15:03:37.383 に答える