pg_class家族成员(名字、类型、引用、描述)
pg_ class 是数据字典最重要的一个表,它保存着所有表、视图、序列、索引的原数据信息,每一个DDL/DML操作都必须跟这个表发生联系,在进行整库操作时经常使用到pg_class里面的东西,把它们整理出来,对数据库的了解有很大帮助。
**名字 类型 引用 描述**
relname name 表、索引、视图等的名字。
relnamespace oid pg_namespace.oid 包含这个关系的名字空间(模式)的 OID
reltype oid pg_type.oid 对应这个表的行类型的数据类型(索引为零,它们没有 pg_type 记录)。
relowner oid pg_authid.oid 关系所有者
relam oid pg_am.oid 如果行是索引,那么就是所用的访问模式(B-tree, hash 等等)
relfilenode oid 这个关系在磁盘上的文件的名字,如果没有则为 0
reltablespace oid pg_tablespace.oid 这个关系存储所在的表空间。如果为零,则意味着使用该数据库的缺省表空间。如果关系在磁盘上没有文件,则这个字段没有什么意义。
relpages int4 以页(大小为 BLCKSZ)的此表在磁盘上的形式的大小。它只是规划器用的一个近似值,是由 VACUUM, ANALYZE 和几个 DDL 命令,比如 CREATE INDEX 更新。
reltuples float4 表中行的数目。只是规划器使用的一个估计值,由 VACUUM, ANALYZE 和几个 DDL 命令,比如 CREATE INDEX 更新。
reltoastrelid oid pg_class.oid 与此表关联的 TOAST 表的 OID ,如果没有为 0 。TOAST 表在一个从属表里"离线"存储大字段。
reltoastidxid oid pg_class.oid 对于 TOAST 表是它的索引的 OID ,如果不是 TOAST 表则为 0
relhasindex bool 如果它是一个表而且至少有(或者最近有过)一个索引,则为真。它是由 CREATE INDEX 设置的,但 DROP INDEX 不会立即将它清除。如果 VACUUM 现一个表没有索引,那么它将清理 relhasindex 。
relisshared bool 如果该表在整个集群中由所有数据库共享则为真。只有某些系统表(比如 pg_database)是共享的。
relkind char r = 普通表, i = 索引, S = 序列, v = 视图, c = 复合类型, t = TOAST 表
relnatts int2 关系中 用户字段数目(除了系统字段以外)。在 pg_attribute 里肯定有相同数目对应行。又见 pg_attribute.attnum
relchecks int2 表里的检查约束的数目;参阅 pg_constraint 表
reltriggers int2 表里的触发器的数目;参阅 pg_trigger 表
relukeys int2 未使用(不是唯一值的数目)
relfkeys int2 未使用(不是表中外键的数目)
relrefs int2 未使用
relhasoids bool 如果为关系中每行都生成一个 OID 则为真
relhaspkey bool 如果这个表有一个(或者曾经有一个)主键,则为真。
relhasrules bool 如表有规则就为真;参阅 pg_rewrite 表
relhassubclass bool 如果有(或者曾经有)任何继承的子表,为真。
relfrozenxid xid 该表中所有在这个之前的事务 ID 已经被一个固定的("frozen")事务 ID 替换。这用于跟踪该表是否需要为了防止事务 ID 重叠或者允许收缩 pg_clog 而进行清理。如果该关系不是表则为零(InvalidTransactionId)。
relacl aclitem[] 访问权限。参阅 GRANT 和 REVOKE 获取详细信息。
reloptions text[] 访问方法特定的选项,使用"keyword=value"格式的字符串
例1:查看各个数据库表大小(不包含索引),以及表数据量
select table_schema,TABLE_NAME,reltuples,pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"'))
from pg_class,information_schema.tables where relname=TABLE_NAME
ORDER BY reltuples desc limit 20
例2:查询数据表名称及中文备注、每个表的记录数:
SELECT a.relname AS name,
b.description AS comment,
a.reltuples
FROM pg_class a
LEFT OUTER JOIN pg_description b ON b.objsubid=0 AND a.oid = b.objoid
WHERE a.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname='public') AND a.relkind='r'
ORDER BY a.relname;
例3 : 在posgres数据库中查询pg_class的内容
select * from pg_class