Postgresql統計所有表的基本資訊(如行數、大小等)
pg_class 目錄 pg_class 記錄表和幾乎所有具有列或者像表的東西。這包括索引(但還要參見 pg_index )、序列、檢視、物化檢視、組合型別和TOAST表。 pg_class 中的一些邏輯標誌被以一種懶惰的方式維護:在正確狀態時它們被保證為真,但是當條件不再為真時它們並不會被立刻重置為假。例如, relhasindex 由 CREATE INDEX 設定,但它從不會被DROP INDEX 清除。作為替代, VACUUM 會在找到無索引表後清除其 relhasindex 。這種安排避免了競爭條件並且提高了併發性
名稱 | 型別 | 參考 | 描述 |
oid | oid | 行識別符號(隱藏屬性;必須明確選擇) | |
relname | name | 表格,索引,檢視等的名稱 | |
relnamespace | oid | 包含此relation的名稱空間的oid | |
reltype | oid | 與此錶行型別對應的資料型別的oid(如果有的話)(對於沒有pg_type條目的索引,為零 ) | |
reloftype | oid | 對於型別表,基礎複合型別的oid,對於所有其他relation為零 | |
relowner | oid | relation的所有者 | |
relam | oid | pg_am.oid | 如果這是一個索引,則使用的訪問方法(B-樹,雜湊等) |
relfilenode | oid | 該relation的磁碟檔案的名稱; 零表示這是一個“對映”relation,其磁碟檔名由低階狀態決定 | |
reltablespace | oid | 儲存該relation的表空間。如果為零,則隱含資料庫的預設表空間。(如果relation沒有磁碟上的檔案,則無意義。) | |
relpages | int4 | 該表的磁碟表示的大小(頁面大小為BLCKSZ)。這只是計劃者使用的估計值。它由 VACUUM,ANALYZE和一些DDL命令(如 CREATE INDEX)更新。 | |
reltuples | float4 | 表中的行數。這只是計劃者使用的估計值。它由VACUUM,ANALYZE和一些DDL命令(如CREATE INDEX)更新。 | |
relallvisible | int4 | 在表格的可見性圖中標記為全部可見的頁面數。這只是計劃者使用的估計值。它由VACUUM,ANALYZE和一些DDL命令(如CREATE INDEX)更新。 | |
reltoastrelid | oid | 與此表關聯的TOAST表的oid,如果沒有,則為0。TOAST表在“輔助表”中儲存“超出行”的大型屬性 。 | |
relhasindex | bool | 如果這是一個表並且它有(或最近有)任何索引,則為真 | |
relisshared | bool | 如果此表在群集中的所有資料庫之間共享,則為true。只有某些系統目錄(如 pg_database)被共享。 | |
relpersistence | char | p =永久表, u =未記錄表,t =臨時表 | |
relkind | char | r =普通表, i =索引,S =序列,v =檢視,m =物化檢視, c =複合型別,t = TOAST表,f =外部表 | |
relnatts | int2 | relation中的使用者列數(系統列未計數)。pg_attribute中必須有許多相應的條目。另見pg_attribute.attnum。 | |
relchecks | int2 | ||
relhasoids | bool | 如果我們為relation的每一行生成oid,則為真 | |
relhaspkey | bool | 如果表具有(或曾經有)主鍵,則為真 | |
relhasrules | bool | 如果表具有(或曾經有)規則,則為真; 請參閱pg_rewrite目錄 | |
relhastriggers | bool | 如果表具有(或曾經有)觸發器,則為真; 請參閱 pg_trigger目錄 | |
relhassubclass | bool | 如果表有(或曾經有過)任何繼承孩子,則為真 | |
relrowsecurity | bool | 如果表已啟用行級安全性,則為true; 請參閱 pg_policy目錄 | |
relforcerowsecurity | bool | 如果行級別安全性(啟用時)也為true,則也適用於表所有者; 請參閱pg_policy目錄 | |
relispopulated | bool | 如果relation被填充,則為真(對於除某些例項化檢視之外的所有relation都是如此) | |
relreplident | char | 用於為行構成“副本標識”的列:d = default(主鍵,如果有的話),n =無,f =所有列 i =具有indisreplident set的索引或default | |
relfrozenxid | xid | 在此表之前的所有交易ID已被替換為永久(“凍結”)交易ID。這用於跟蹤是否需要將表抽真空以防止事務ID環繞或允許縮小pg_clog。零(InvalidTransactionId)如果relation不是一個表。 | |
relminmxid | xid | 在此表之前的所有多重作業ID已由該事務ID替換。這用於跟蹤是否需要將表抽真空以防止多軸實現ID 繞回或允許縮小pg_multixact。零(InvalidMultiXactId)如果relation不是一個表。 | |
relacl | aclitem[] | ||
reloptions | text[] | 特定於訪問方法的選項,如“keyword = value”字串 |
select relname as TABLE_NAME, reltuples as rowCounts from pg_class where relkind = 'r' and relnamespace = (select oid from pg_namespace where nspname='public') order by rowCounts desc;
因懶惰的方式維護,當有新的資料插入表中時,上述命令執行結果不會改變,需要重新整理資料表,需先執行:
vacuum tablename #更新某個表
vacuum #在某個資料庫中執行直接更新該資料庫所有表
vacuum的效果: 1.1釋放,再利用 更新/刪除的行所佔據的磁碟空間. 1.2更新POSTGRESQL查詢計劃中使用的統計資料 1.3防止因事務ID的重置而使非常老的資料丟失。
第一點的原因是PostgreSQL資料的插入,更新,刪除操作並不是真正放到資料庫空間.如果不定期釋放空間的話,由於資料太多,查詢速度會巨降. 第二點的原因是PostgreSQL在做查詢處理的時候,為了是查詢速度提高,會根據統計資料來確定執行計劃.如果不及時更新的話,查詢的效果可能不如預期. 第三點的原因是PostgreSQL中每一個事務都會產生一個事務ID,但這個數字是有上限的. 當事務ID達到最大值後,會重新從最小值開始迴圈.這樣如果不及時把以前的資料釋放掉的話,原來的老資料會因為事務ID的丟失而丟失掉。
select relname as tabname,cast(obj_description(relfilenode,'pg_class') as varchar) as comment from pg_class c where relname ='table_name' ;
2、查詢欄位名、欄位型別及欄位長度和欄位註釋
select a.attnum,a.attname,
concat_ws('',t.typname,SUBSTRING(format_type(a.atttypid,a.atttypmod) from '\(.*\)')) as type,d.description from pg_class c, pg_attribute a , pg_type t, pg_description d where c.relname = 'table_name' and a.attnum>0 and a.attrelid = c.oid and a.atttypid = t.oid and d.objoid=a.attrelid and d.objsubid=a.attnum
select pg_size_pretty(pg_relation_size('table_name'));
4、查詢所有表並按大小排序
SELECT
table_schema || '.' || table_name
AS table_full_name, pg_size_pretty(pg_total_relation_size('"' ||table_schema || '"."' || table_name || '"')) AS size
FROM
information_schema.tables
ORDER BY
pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')
DESC limit 20
SELECT
table_name,
pg_size_pretty(table_size) AS table_size,
pg_size_pretty(indexes_size) AS indexes_size,
pg_size_pretty(total_size) AS total_size
FROM (
SELECT
table_name,
pg_table_size(table_name) AS table_size,
pg_indexes_size(table_name) AS indexes_size,
pg_total_relation_size(table_name) AS total_size
FROM (
SELECT ('"' || table_schema || '"."' || table_name || '"') AS table_name
FROM information_schema.tables
) AS all_tables
ORDER BY total_size DESC
) AS pretty_sizes
6、統計各資料庫佔用的磁碟大小
SELECT d.datname AS Name, pg_catalog.pg_get_userbyid(d.datdba) AS Owner,
CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname))
ELSE 'No Access'
END AS SIZE
FROM pg_catalog.pg_database d
ORDER BY
CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
THEN pg_catalog.pg_database_size(d.datname)
ELSE NULL
END DESC -- nulls first
LIMIT 20