Postgresql
數據庫是 300 GB,但我只看到小表?
我想知道為什麼我的數據庫這麼大。我輸入:
SELECT pg_size_pretty(pg_database_size('defaultdb'));
它說defaultdb是259 GB。那是巨大的。
所以我在 psql 中列出了我的表:
\dt
對於我鍵入的每個表:
SELECT pg_size_pretty( pg_total_relation_size('tablename') );
我得到:
city_zip 0.048 MB ntaboundaries 1.9 MB zipcodeboundaries 2.4 MB spatial_ref_sys 7.2 MB
到底是怎麼回事?是
pg_database_size()
告訴我分配的記憶體,而不是使用的儲存記憶體嗎?是否有其他隱藏位置,例如日誌,佔用儲存空間,如果有,如何查詢日誌的大小?
pg_total_relation_size()
總結屬於表的所有內容,包括膨脹。但是
\dt
在 psql 中並沒有列出數據庫的所有表,它只包括目前search_path
. 檢查:SHOW search_path;
pg_catalog
始終排除其中的系統表。並且可能還有其他模式。要查看數據庫中的所有表:\dt *.*
只要完全省略了模式參數,
\d
命令就會顯示在目前模式搜尋路徑中可見的所有對象——這相當於使用*
模式。(如果對象的包含模式在搜尋路徑中,並且在搜尋路徑的前面沒有出現相同類型和名稱的對象,則稱該對像是可見的。這等效於可以通過名稱引用對象而無需顯式模式的聲明資格。)要查看數據庫中的所有對象而不管可見性如何,請*.*
用作模式。要查看目前數據庫中最大的關係(確保連接到正確的關係!):
SELECT pg_size_pretty(pg_total_relation_size(c.oid)), c.oid::regclass, relkind FROM pg_class c ORDER BY pg_total_relation_size(c.oid) DESC LIMIT 10;
我使用它
c.oid::regclass
是因為它會在需要可見的地方自動顯示具有模式限定的表。請注意,在使用 查詢時,索引 (
relkind = 'i'
) 包含在表 (relkind = 'r'
)的大小中pg_total_relation_size()
。但它們也在此列表中單獨列出。pg_class
手冊中有關的詳細資訊。有關的: