PG中的系统表和系统视图(数据字典)

0    1952    2

Tags:

👉 本文共约20632个字,系统预计阅读时间或需78分钟。

系统表

大多数系统表都是在数据库创建的过程中从模版数据库中拷贝过来的,因此都是数据库相关的。少数表是在整个安装中物理上所有数据库共享的;这些表在独立的表的描述中用指明了。

查看数据库系统表命令

表名字 用途

  • pg_aggregate 聚集函数
  • pg_am 索引访问方法
  • pg_amop 访问方法操作符
  • pg_amproc 访问方法支持过程
  • pg_attrdef 字段缺省值
  • pg_attribute 表的列(也称为”属性”或”字段”)
  • pg_authid 认证标识符(角色)
  • pg_auth_members 认证标识符成员关系
  • pg_autovacuum 每个关系一个的自动清理配置参数
  • pg_cast 转换(数据类型转换)
  • pg_class 表、索引、序列、视图(“关系”)
  • pg_constraint 检查约束、唯一约束、主键约束、外键约束
  • pg_conversion 编码转换信息
  • pg_database 本集群内的数据库
  • pg_depend 数据库对象之间的依赖性
  • pg_description 数据库对象的描述或注释
  • pg_index 附加的索引信息
  • pg_inherits 表继承层次
  • pg_language 用于写函数的语言
  • pg_largeobject 大对象
  • pg_listener 异步通知
  • pg_namespace 模式
  • pg_opclass 索引访问方法操作符类
  • pg_operator 操作符
  • pg_pltemplate 过程语言使用的模板数据
  • pg_proc 函数和过程
  • pg_rewrite 查询重写规则
  • pg_shdepend 在共享对象上的依赖性
  • pg_shdescription 共享对象上的注释
  • pg_statistic 优化器统计
  • pg_tablespace 这个数据库集群里面的表空间
  • pg_trigger 触发器
  • pg_type 数据类型

pg_class

查询所有业务表信息

查询所有业务表名称及表描述

查询某表的字段信息

 pg_class (系统表:对象)是一个对象表,表的每个字段都是‘rel’开头,分明就是 ‘relation’这个单词的缩写,意思就是‘关系’。表中relkind字段决定对象类型:r = 普通表,i = 索引,S = 序列,v = 视图, c = 复合类型,s = 特殊,t = TOAST表。对象所属的relnamespace(模式名称)和relowner(所有者)都是用其对应的oid显示,所以要直观看到实际本名要联合pg_namespace(系统表:模式)和pg_roles(系统视图:角色)一起查,这两个表和视图中都有oid字段。

该系统表记录了数据表、索引(仍然需要参阅pg_index)、序列、视图、复合类型和一些特殊关系类型的元数据。注意:不是所有字段对所有对象类型都有意义。

名称类型参考描述
oidoid行标识符(隐藏属性;必须明确选择)
relnamename表格,索引,视图等的名称
relnamespaceoidpg_namespace.oid包含此relation的名称空间的oid
reltypeoidpg_type .oid与此表行类型对应的数据类型的oid(如果有的话)(对于没有pg_type条目的索引,为零 )
reloftypeoidpg_type .oid对于类型表,基础复合类型的oid,对于所有其他relation为零
relowneroidpg_authid.oidrelation的所有者
relamoidpg_am.oid如果这是一个索引,则使用的访问方法(B-树,散列等)
relfilenodeoid该relation的磁盘文件的名称; 零表示这是一个“映射”relation,其磁盘文件名由低级状态决定
reltablespaceoidpg_tablespace.oid存储该relation的表空间。如果为零,则隐含数据库的默认表空间。(如果relation没有磁盘上的文件,则无意义。)
relpagesint4该表的磁盘表示的大小(页面大小为BLCKSZ)。这只是计划者使用的估计值。它由 VACUUM,ANALYZE和一些DDL命令(如 CREATE INDEX)更新。
reltuplesfloat4表中的行数。这只是计划者使用的估计值。它由VACUUM,ANALYZE和一些DDL命令(如CREATE INDEX)更新。
relallvisibleint4在表格的可见性图中标记为全部可见的页面数。这只是计划者使用的估计值。它由VACUUM,ANALYZE和一些DDL命令(如CREATE INDEX)更新。
reltoastrelidoidpg_class .oid与此表关联的TOAST表的oid,如果没有,则为0。TOAST表在“辅助表”中存储“超出行”的大型属性 。
relhasindexbool如果这是一个表并且它有(或最近有)任何索引,则为真
relissharedbool如果此表在群集中的所有数据库之间共享,则为true。只有某些系统目录(如 pg_database)被共享。
relpersistencecharp =永久表, u =未记录表,t =临时表
relkindcharr = 普通表, i = 索引, S = 序列, t = TOAST表, v = 视图, m = 物化视图, c = 组合类型, f = 外部表, p = 分区表, I = 分区索引
relnattsint2relation中的用户列数(系统列未计数)。pg_attribute中必须有许多相应的条目。另见pg_attribute.attnum。
relchecksint2表上CHECK约束的数量; 请参阅pg_constraint目录
relhasoidsbool如果我们为relation的每一行生成oid,则为真
relhaspkeybool如果表具有(或曾经有)主键,则为真
relhasrulesbool如果表具有(或曾经有)规则,则为真; 请参阅pg_rewrite目录
relhastriggersbool如果表具有(或曾经有)触发器,则为真; 请参阅 pg_trigger目录
relhassubclassbool如果表有(或曾经有过)任何继承孩子,则为真
relrowsecuritybool如果表已启用行级安全性,则为true; 请参阅 pg_policy目录
relforcerowsecuritybool如果行级别安全性(启用时)也为true,则也适用于表所有者; 请参阅pg_policy目录
relispopulatedbool如果relation被填充,则为真(对于除某些实例化视图之外的所有relation都是如此)
relreplidentchar用于为行构成“副本标识”的列:d = default(主键,如果有的话),n =无,f =所有列 i =具有indisreplident set的索引或default
relfrozenxidxid在此表之前的所有交易ID已被替换为永久(“冻结”)交易ID。这用于跟踪是否需要将表抽真空以防止事务ID环绕或允许缩小pg_clog。零(InvalidTransactionId)如果relation不是一个表。
relminmxidxid在此表之前的所有多重作业ID已由该事务ID替换。这用于跟踪是否需要将表抽真空以防止多轴实现ID 绕回或允许缩小pg_multixact。零(InvalidMultiXactId)如果relation不是一个表。
relaclaclitem[]访问权限; 看到GRANTREVOKE的细节
reloptionstext[]特定于访问方法的选项,如“keyword = value”字符串

pg_attribute

该系统表存储所有表(包括系统表,如pg_class)的字段信息。数据库中的每个表的每个字段在pg_attribute表中都有一行记录。

另外,查询列信息也可以使用information_schema.columns视图。

名字类型引用描述
attrelidoidpg_class.oid此字段所属的表。
attnamename字段名。
atttypidoidpg_type.oid字段的数据类型。
attstattargetint4attstattarget控制ANALYZE为这个字段设置的统计细节的级别。零值表示不收集统计信息,负数表示使用系统缺省的统计对象。正数值的确切信息是和数据类型相关的。
attlenint2该字段所属类型的长度。(pg_type.typlen的拷贝)
attnumint2字段的编号,普通字段是从1开始计数的。系统字段,如oid,是任意的负数。
attndimsint4如果该字段是数组,该值表示数组的维数,否则是0。
attcacheoffint4在磁盘上总是-1,但是如果装载入内存中的行描述器中, 它可能会被更新为缓冲在行中字段的偏移量。
atttypmodint4表示数据表在创建时提供的类型相关的数据(比如,varchar字段的最大长度)。其值对那些不需要atttypmod的类型而言通常为-1。
attbyvalboolpg_type.typbyval字段值的拷贝。
attstoragecharpg_type.typstorage字段值的拷贝。
attaligncharpg_type.typalign字段值的拷贝。
attnotnullbool如果该字段带有非空约束,则为真,否则为假。
atthasdefbool该字段是否存在缺省值,此时它对应pg_attrdef表里实际定义此值的记录。
attisdroppedbool该字段是否已经被删除。如果被删除,该字段在物理上仍然存在表中,但会被分析器忽略,因此不能再通过SQL访问。
attislocalbool该字段是否局部定义在对象中的。
attinhcountint4该字段所拥有的直接祖先的个数。如果一个字段的祖先个数非零,那么它就不能被删除或重命名。

pg_attrdef

该系统表主要存储字段缺省值,字段中的主要信息存放在pg_attribute系统表中。注意:只有明确声明了缺省值的字段在该表中才会有记录。

名字类型引用描述
adrelidoidpg_class.oid这个字段所属的表
adnumint2pg_attribute.attnum字段编号,其规则等同于pg_attribute.attnum
adbintext字段缺省值的内部表现形式。
adsrctext缺省值的人可读的表现形式。

pg_authid

该系统表存储有关数据库认证的角色信息,在PostgreSQL中角色可以表现为用户和组两种形式。对于用户而言只是设置了rolcanlogin标志的角色。由于该表包含口令数据,所以它不是公共可读的。PostgreSQL中提供了另外一个建立在该表之上的系统视图pg_roles,该视图将口令字段填成空白。

名字类型引用描述
rolnamename角色名称。
rolsuperbool角色是否拥有超级用户权限。
rolcreaterolebool角色是否可以创建其它角色。
rolcreatedbbool角色是否可以创建数据库。
rolcatupdatebool角色是否可以直接更新系统表(如果该设置为假,即使超级用户也不能更新系统表)。
rolcanloginbool角色是否可以登录,换句话说,这个角色是否可以给予会话认证标识符。
rolpasswordtext口令(可能是加密的);如果没有则为NULL。
rolvaliduntiltimestamptz口令失效时间(只用于口令认证);如果没有失效期,则为NULL。
rolconfigtext[]运行时配置变量的会话缺省。

pg_auth_members

该系统表存储角色之间的成员关系。

名字类型引用描述
roleidoidpg_authid.oid组角色的ID。
memberoidpg_authid.oid属于组角色roleid的成员角色的ID。
grantoroidpg_authid.oid赋予此成员关系的角色的ID。
admin_optionbool如果具有把其它成员角色加入组角色的权限,则为真。

pg_constraint

该系统表存储PostgreSQL中表对象的检查约束、主键、唯一约束和外键约束。

名字类型引用描述
connamename约束名字(不一定是唯一的)。
connamespaceoidpg_namespace.oid包含这个约束的名字空间(模式)的OID。
contypecharc = 检查约束, f = 外键约束, p = 主键约束, u = 唯一约束
condeferrablebool该约束是否可以推迟。
condeferredbool缺省时这个约束是否是推迟的?
conrelidoidpg_class.oid该约束所在的表,如果不是表约束则为0。
contypidoidpg_type.oid该约束所在的域,如果不是域约束则为0。
confrelidoidpg_class.oid如果为外键,则指向参照的表,否则为0。
confupdtypechar外键更新动作代码。
confdeltypechar外键删除动作代码。
confmatchtypechar外键匹配类型。
conkeyint2[]pg_attribute.attnum如果是表约束,则是约束控制的字段列表。
confkeyint2[]pg_attribute.attnum如果是外键,则是参照字段的列表。
conbintext如果是检查约束,则表示表达式的内部形式。
consrctext如果是检查约束,则是表达式的人可读的形式。

pg_tablespace

该系统表存储表空间的信息。注意:表可以放在特定的表空间里,以帮助管理磁盘布局和解决IO瓶颈。

名字类型引用描述
spcnamename表空间名称。
spcowneroidpg_authid.oid表空间的所有者,通常是创建它的角色。
spclocationtext表空间的位置(目录路径)。
spcaclaclitem[]访问权限。

pg_namespace

该系统表存储名字空间(模式)。

名字类型引用描述
nspnamename名字空间(模式)的名称。
nspowneroidpg_authid.oid名字空间(模式)的所有者
nspaclaclitem[]访问权限。

pg_database

该系统表存储数据库的信息。和大多数系统表不同的是,在一个集群里该表是所有数据库共享的,即每个集群只有一份pg_database拷贝,而不是每个数据库一份。

名字类型引用描述
datnamename数据库名称。
datdbaoidpg_authid.oid数据库所有者,通常为创建该数据库的角色。
encodingint4数据库的字符编码方式。
datistemplatebool如果为真,此数据库可以用于CREATE DATABASE TEMPLATE子句,把新数据库创建为此数据库的克隆。
datallowconnbool如果为假,则没有人可以联接到这个数据库。
datlastsysoidoid数据库里最后一个系统OID,此值对pg_dump特别有用。
datvacuumxidxid
datfrozenxidxid
dattablespacetextpg_tablespace.oid该数据库的缺省表空间。在这个数据库里,所有pg_class.reltablespace为零的表都将保存在这个表空间里,特别要指出的是,所有非共享的系统表也都存放在这里。
datconfigtext[]运行时配置变量的会话缺省值。
dataclaclitem[]访问权限。

pg_index

该系统表存储关于索引的一部分信息。其它的信息大多数存储在pg_class。

名字类型引用描述
indexrelidoidpg_class.oid该索引在pg_class里的记录的OID。
indrelidoidpg_class.oid索引所在表在pg_class里的记录的OID。
indnattsint2索引中的字段数量(拷贝的pg_class.relnatts)。
indisuniquebool如果为真,该索引是唯一索引。
indisprimarybool如果为真,该索引为该表的主键。
indisclusteredbool如果为真,那么该表在这个索引上建了簇。
indkeyint2vectorpg_attribute.attnum该数组的元素数量为indnatts,数组元素值表示建立这个索引时所依赖的字段编号,如1 3,表示第一个字段和第三个字段构成这个索引的键值。如果为0,则表示是表达式索引,而不是基于简单字段的索引。
indclassoidvectorpg_opclass.oid对于构成索引键值的每个字段,这个字段都包含一个指向所使用的操作符表的OID。
indexprstext表达式树用于那些非简单字段引用的索引属性。它是一个列表,在indkey里面的每个零条目一个元素。如果所有索引属性都是简单的引用,则为空。
indpredtext部分索引断言的表达式树。如果不是部分索引, 则是空字串。

见如下应用示例:

pg_statistic

目录pg_statistic存储有关数据库内容的统计数据。其中的项由ANALYZE创建,查询规划器会使用这些数据来进行查询规划。注意所有的统计数据天然就是近似的,即使它刚刚被更新。

通常对于数据表中一个已经被 ANALYZE 过的列,在本目录中会存在一个stainherit = false的项。如果该列所在的表具有后代(即有其他表继承该表),对于该列还会创建第二个stainherit = true的项。stainherit = true的项表示列在整个继承树上的统计数据,即通过SELECT *column* FROM *table**看到的数据的统计,而stainherit = false的项表示对SELECT *column* FROM ONLY *table*的结果的统计。

pg_statistic也存储关于索引表达式值的统计数据,就好像它们是真正的数据列,但在这种情况中starelid指索引。对一个普通非表达式索引列不会创建项,因为它将是底层表列的项的冗余。当前,索引表达式的项都具有stainherit = false

因为不同类型的统计信息适用于不同类型的数据, pg_statistic 被设计成不太在意自己存储的是什么类型的统计。 只有极为常用的统计信息(比如NULL的含量)才在pg_statistic里给予专用的字段。 其它所有东西都存储在“槽位”中,而槽位是一组相关的列, 它们的内容用槽位中的一个列里的代码表示。 更详细的信息请参阅 src/include/catalog/pg_statistic.h

pg_statistic不应该是公共可读的,因为即使是一个表内容的统计性信息也可能被认为是敏感的(例子:一个薪水列的最大和最小值可能是非常有趣的)。pg_statspg_statistic上的一个公共可读的视图,它只会显示出当前用户可读的表的信息。

pg_statistic Columns

列类型描述
starelid oid (references pg_class.oid)被描述列所属的表或索引
staattnum int2 (references pg_attribute.attnum)被描述列的编号
stainherit bool如果为真,统计包含了继承后代的列而不仅仅是指定关系的列
stanullfrac float4列的项为空的比例
stawidth int4非空项的平均存储宽度,以字节计
stadistinct float4列中非空唯一值的数目。一个大于零的值是唯一值的真正数目。 一个小于零的值是表中行数的乘数的负值;例如,对于一个 80% 的值为非空且每个非空值平均出现两次的列,可以表示为stadistinct = -0.4。一个0值表示唯一值的数目未知。
stakindN int2一个代码,它表示存储在该pg_statistic行中第*N*个“槽位”的统计类型。
staop*N oid (references [pg_operator](http://postgres.cn/docs/13/catalog-pg-operator.html).oid)一个用于生成这些存储在第*N*个“槽位”的统计信息的操作符。 比如,一个柱面图槽位会用操作符,该操作符定义了该数据的排序顺序。
stacollN oid (references [pg_collation](http://postgres.cn/docs/13/catalog-pg-collation.html).oid)排序规则用于导出存储在第*N*个“槽”中的统计信息。 例如,可排序列的直方图槽将显示定义数据排序顺序的排序规则。对于不可整理数据,为零。
stanumbersN float4[]第*N`个“槽位”的类型的数值类型统计, 如果该槽位不涉及数值类型则为NULL
stavaluesN anyarray第*N*个“槽位”的类型的列值,如果该槽位类型不存储任何数据值则为 NULL。 每个数组的元素值实际上都是指定列的数据类型或者是一个相关类型(如数组元素类型), 因此,除了把这些列的类型定义成anyarray`之外别无他法。

系统视图

除了系统表之外,PostgreSQL 还提供了一系列内置的视图。 系统视图提供了查询系统表的一些便利的访问方法。 其它一些视图提供了访问内部服务器状态的方法。

  信息模式提供了另外一套视图,它的功能覆盖了系统视图的功能。因为信息模式是 SQL 标准,而这里描述的视图是 PostgreSQL 特有的,所以最好用信息模式来获取自己需要的所有信息。

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!
AiDBA后续精彩内容已被站长无情隐藏,请输入验证码解锁本文!
验证码:
获取验证码: 请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“AiDBA”或者“dbaup6”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复