1 前言
可能大家平时会查看数据库中的一些原始信息,比如数据库有哪些表,表有哪些字段呀,都是什么类型呀,甚至每个表所占的空间大小,索引的空间大小、索引访问的次数呀等等,其实 PgSQL 都有对应的系统目录给我们,这节我们就来看看。
2 层次
在看元信息前,我们先了解一下数据的一个层次:
可以看到,我们的表位于第四层,哪个服务器的哪个数据库,数据库可能有的会根据不同的租户划分不同的 schema 下(如果没有指定的话,那么默认表都会创建到 public 下),最后到我们的表。当我们查询或者操作表的时候,shcmea.表名(没有指定 schema 则默认操作 public)。
为什么要说一下这个层次呢?主要是想到 schema 这个东西,因为我看元信息的时候,发现有 pg_tables
、pg_attribute
能查表信息、表的字段信息,而 information_schema 也能查到,那功能是不是重复了呢?
在某种程度上,information_schema
和 PostgreSQL 的系统目录(如 pg_tables
、pg_class
、pg_attribute
等)确实提供了类似的功能,即都可以查询数据库的元数据信息。但它们之间存在一些重要的区别:
-
标准化:
information_schema
是 SQL 标准的一部分,旨在提供一个标准化的接口来访问数据库的元数据。这意味着,无论你使用的是 PostgreSQL、MySQL、SQL Server 还是其他支持该标准的数据库,你都可以使用相同的查询来获取类似的信息。而 PostgreSQL 的系统目录则是特定于实现的,它们的结构和命名可能会在不同的数据库系统中有所不同。 -
范围和详细程度:
information_schema
通常提供用户级别的视图,这些视图隐藏了底层实现的复杂性,并以更易于理解和使用的方式呈现信息。相比之下,PostgreSQL 的系统目录提供了更详细和更低级别的信息,包括内部数据结构、存储参数、访问权限等。这些额外的信息对于数据库管理员和需要进行高级调优或故障排除的用户来说是非常有用的。 -
性能:由于
information_schema
视图是基于 PostgreSQL 系统目录构建的,因此在某些情况下,直接查询系统目录可能会更快,尤其是当你需要访问大量数据或进行复杂的查询时。然而,对于大多数常规用途来说,information_schema
的性能已经足够好,而且它的易用性和标准化优势通常更加重要。 -
兼容性:如果你的应用程序或查询需要在多个数据库系统上运行,并且你希望保持代码的一致性,那么使用
information_schema
可能是更好的选择。这样,你可以编写一次代码,并在多个系统上重复使用它,而无需担心特定于实现的差异。
综上所述,虽然 information_schema
和 PostgreSQL 的系统目录在某些方面存在重叠,但它们各自具有独特的优势和用途。你可以根据你的具体需求和上下文来选择使用哪一个(来自文心一言的解答)。
另外查看数据库的 schema:
SELECT schema_name FROM information_schema.schemata;
这将列出当前数据库中所有的 schemas,包括预定义的和用户定义的。如果你有足够的权限,你还可以使用 CREATE SCHEMA
语句来创建新的 schemas,并使用 DROP SCHEMA
语句来删除它们(但要小心,因为这也会删除 schema 下的所有对象,除非使用 CASCADE
选项)。
在 PostgreSQL 中,除了 information_schema
之外,还有其他几个预定义的 schemas(模式)和用户定义的 schemas。以下是一些常见的 schemas:
-
public: 这是默认的 schema,当你创建一个新的对象(如表、视图等)而没有指定 schema 时,它会被创建在
public
schema 下。 -
pg_catalog: 这个 schema 包含了系统表、系统视图和系统函数,它们存储了 PostgreSQL 数据库的元数据和维护信息。通常,用户不需要直接查询这些表,但是它们对于数据库管理员和开发者在需要深入了解系统内部运作时是非常有用的。
-
pg_toast: 这个 schema 用于存储大型对象的“外部”存储。当你使用大型对象(如 BLOBs)时,PostgreSQL 会将部分数据存储在这个 schema 下的表中。这是为了优化存储和检索大型数据。
-
用户定义的 schemas: 除了预定义的 schemas,用户还可以创建自己的 schemas 来组织数据库对象。这有助于在单个数据库中实现多租户环境、分离不同应用程序的数据或实现其他逻辑分组。
3 系统目录
官方文档:https://www.postgresql.org/docs/14/catalogs.html
中文文档:http://www.postgres.cn/docs/14/catalogs-overview.html
可以看到大概有100个左右的系统目录,我们可以看到常见的:
(1)pg_class:记录表和所有具有列或者像表的东西。这包括索引(但还要参见pg_index)、序列(但还要参见pg_sequence)、视图、物化视图、组合类型等。
(2)pg_attribute:存储所有表(包括系统表,如pg_class)的字段信息。数据库中的每个表的每个字段在pg_attribute表中都有一行记录。
(3)pg_index:存储关于索引的一部分信息。
(4)pg_constraint:存储表对象的检查约束、主键、唯一约束和外键约束。
(5)pg_tablespace:存储表空间的信息。
(7)pg_database:存储数据库的信息。和大多数系统表不同的是,在一个集群里该表是所有数据库共享的,即每个集群只有一份pg_database拷贝,而不是每个数据库一份。
另外详细的大家可以看文档哈,关于表空间、行数、索引大小等的统计,可以参考我的另一篇:https://www.cnblogs.com/kukuxjx/p/17328340.html
4 小结
好啦,本节就看到这里哈。
标签:information,PostgreSQL,数据库,信息,PostageSQL,pg,系统目录,schema From: https://www.cnblogs.com/kukuxjx/p/18028544