2013-08-07 49 views
4

我們在PostgreSQL 9.1版上運行,之前我們在一個表中有超過1億行並且已被刪除。但是,看起來\l+命令仍然不準確地報告實際的數據庫大小(它報告了568GB,但事實上它遠遠低於)。如何在postgresql中準確獲取數據庫大小?

是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) 
+0

'select pg_size_pretty(pg_database_size('pmlex'));'show 568GB? – bma

+1

Autovacuum已啓用?你可以通過發佈一個手冊'VACUUM;'來加快元組重用的過程,但是這不會收回空間,只會將其標記爲可重用。你刪除了整個表嗎?如果是這樣,爲什麼不'TRUNCATE'?接下來,如果您刪除了表格的* most *,則可能值得創建表格的副本,截斷原件,然後複製回數據。這將釋放空間並重新創建索引(TRUNCATE釋放空間)。 – bma

+0

@bma感謝您的評論。是的,查詢顯示膨脹。 ' pmlex =#選擇pg_size_pretty(pg_database_size('pmlex'));'給出'568 GB'。至於其他關於截斷一張大桌子正確方法的意見 - 不幸的是這些都是在我之前完成的。所以我們現在處於我們現在的狀態。所以我只是想看看是否有一個驗屍修復。 – Devy

回答

2

選項包括:

1)。確保autovacuum已啓用並積極設置。 2)。正如我在前面的評論中所述重新創建表(create-table-as-select +截斷+重新加載原始表)。 3)。如果你能夠承受被鎖定的表(獨佔鎖),在表上運行CLUSTER。 4)。 VACUUM FULL,雖然CLUSTER效率更高,建議使用。 5)。幾次運行普通的VACUUM ANALYZE並保持原樣,最終在新數據進入時填充空間。

6)。通過pg_dump轉儲並重新加載表格

7)。 pg_repack(雖然我還沒有在生產中使用它)

+0

謝謝@bma!我會盡快給出這些。 – Devy

相關問題