1. 程式人生 > >Postgresql統計所有表的基本資訊(如行數、大小等)

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[]

訪問許可權; 看到GRANTREVOKE的細節

reloptions

text[]

特定於訪問方法的選項,如“keyword = value”字串

1、查詢某Schema下的每張表的記錄數:
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