① pg数据库数据文件111代表什么
所有数据库对象都有各自的oid(object identifiers),oid是一个无符号的四字节整数,相关对象的oid都存放在相关的system catalog表中,比如数据库的oid和表的oid分别存放在pg_database,pg_class表中。
1、数据库集群-Database cluster
2、数据库-Database
3、表空间-tablespace
数据库在逻辑上分成多个存储单元,称作表空间。表空间用作把逻辑上相关的结构放在一起。数据库逻辑上是由一个或多个表空间组成。
新创建的数据库默认创建下面的表空间:
1)Catalog表空间 存放系统表信息2)System表空间 存放用户数据3)Temp表空间
4、模式-Schema
自动创建的系统模式如下:
1)PG_CATALOG2)PG_LARGEOBJECT3)PG_TOAST4)PG_PARTITION
默认的用户模式PUBLIC。
5、段-segment
6、区-extent
7、块-block
8、数据库对象-Database object
1)模式对象表、索引、序列、大对象、视图、函数、存储过程、触发器、包 … …2)非模式对象用户、数据库
9、数据表-Table
10、索引-Index
11、序列-Sequence
12、视图-View
二、物理存储结构
在执行initdb的时候会初始化一个目录,通常我们都会在系统配置相关的环境变量$PGDATA来表示,初始化完成后,会再这个目录生成相关的子目录以及一些文件。在postgresql中,tablespace的概念并不同于其他关系型数据库,这里一个tablespace对应的都是一个目录。如下图就是PG的物理结构:
.png
1、存储系统主要包括三个部分:
内存中:buffer,MemoryContext;
数据文件,临时文件;
日志文件,日志缓存。
2、文件和目录相关作用描述:
.png
.png
3、数据文件结构
.png
3.1、页
.png
将数据文件中的空间从逻辑上划分成一个个页面(数据块)。页面是数据库I/O的基本单位,即只能整页读写数据文件, 页面的大小默认是8K。
页面可以分成两种:
1)数据页面:数据页面是用来存储用户数据的。
2)控制页面:控制页面用来管理这些数据页面。
数据库共享缓存中的空间划分也是按页为基本单位, 一个页的大小与数据文件中页的大小一致, 这样便于整页读取数据文件,并放入到数据库Buffer中, 从Buffer写入数据文件也同理,保证了缓存与数据文件结构和内容上的一致性。
3.2、Block(块)
概念上基本等同于Page, 但Block更多用于说明DMS中对数据文件中Page的描述。
例如: 对文件的读写的操作, 文件读写位置的定位, 数据文件空间回收等操作, 单位均是以块进行。
数据块的大小在系统初始化时指定,默认是8K,可以取值4K,8K,16K,32K。
3.3、Extent(区)
把数据文件中8个连续的Page构成的空间称为一个Extent。Extent是数据库进行数据文件空间分配/释放的基本单位。每个表、索引、序列对象都是由若干个区组成。数据文件被创建后,除自动保留部分区作为控制区外,其他区全部处于未分配状态。表、索引、序列对象的所有数据都存放在Extent中,当向这些Extent中插入数据时,若该Extent的所有页面都已占满,系统就会自动在所属表空间的数据文件中寻找一个尚未分配的区,并将其状态修改为数据区。
3.4、控制页面
用于空间管理的控制页面:PFS/GAM/IAM。
用于增量备份的控制页面:DCM。
判断可见性的控制页面:VM。
预留的控制页面:BCM/SGAM。
3.5、PFS
Page Free Space,简称PFS页.
用于记录本数据文件中页面的空间使用情况。对文件中的每个页面,PFS中都有一个“字节”与之对应,该字节记录了该页面的状态。
PFS页前64bytes被预留为页头, 剩下81024-64=8128一共覆盖81288K=64MB空间.
故PFS页每隔8128个页面出现一次, 系统初始化把第一个PFS页放在数据文件的第二个页面位置,即:第1号数据页面, 由此可知,第N个PFS页的位置在8128*N+1.
.png
3.6、GAM
Global Allocation Map,简称GAM页。
功能:记录所在数据文件的Extent的分配情况,GAM页中除GAM头外,剩下空间的每一位(bit)均对应一个Extent的分配情况。若某bit位为1,则表明该bit位所关联的Extent已被分配出去,反之未被分配。
若一个GAM页面大小为8K,则除GAM头(64 bytes)外,一个GAM页面所能覆盖的文件范围是: (81024-64)8(88K),约4GB空间。此外,GAM页每隔881288个页面出现一个,系统要求第一个GAM页出现在文件的第3个页面位置(即:第2个索引位置),由此得知,第N个GAM页的出现位置是: 881288*N+2
.png
3.7、IAM
Index Allocation Map,简称IAM页。
功能:每个IAM页只隶属于一个数据库对象(例如:表),但一个数据库对象可包含多个IAM页,由此可见IAM页与数据库对象的关系是1对1,而数据库对象与IAM页的关系是1对多.
IAM的结构与GAM页类似,除IAM头外,剩下空间的每一位(bit)均对应着一个与IAM相关的Extent。若某bit位为1,则表明该bit位所关联的Extent已被分配给该IAM,反之未被分配。若一个IAM页面大小为8K,则除IAM头(64 bytes)外,一个IAM页面所能覆盖的文件范围是: (81024-64)8(88K),约4GB空间。
但与GAM也不同之处在于:IAM的出现位置不固定,只在在创建数据库对象的时候才分配。
.png
三、逻辑与物理存储关系
1、逻辑关系存在表空间;
2、表空间存在对应的数据文件中;
新创建的数据库对应的数据文件的名称:
Catalog表空间 – databasename.dbfSystem表空间 – Udatabasename.dbfTemp表空间-- Tdatabasename.dbf
前面加 “U” 前缀代表用户数据表空间,用于保存用户表的数据。
不带 U 代表 是系统表的表空间,用于保存系统表的数据。
U 前缀的数据文件代表的表空间名为PG。
不带U 的数据文件代表的表空间为 CATALOG。
四、数据库文件、表空间、其他文件之间的关系
1、关系图如下:
.png
说明:
1)每一个数据库具有一个或多个数据文件,用户存放数据库的所有数据。
2)数据库的数据文件有以下特征:
一个数据库文件只能与一个数据库的一个表空间相连。
一个表空间可以由多个数据文件组成。
3)数据库对象与文件关系:
数据库对象放到表空间中。
表空间有多个数据文件。
表空间中有多个数据库对象。
4)数据库对象逻辑上是存储在表空间中,物理上是存储在与表空间相关联的数据文件中。
2、数据库包含的文件种类:
1)数据库文件:data/DB
数据库对象,如:数据库、表,索引,序列等对象。
2)控制文件:data/CTL
用来记录数据库集群的状态信息,如:版本信息、集群所管理的各种文件信息、检查点信息、事务状态信息等。
3)日志文件:data/REDOLOG
记录数据修改操作的日志,用于系统发生故障时进行数据恢复。
4)临时文件:data/DB
存放数据库进行计算的过程中,生成的各种中间对象,如排序运算的外存归并单元。
5)参数文件:data目录下
五、Postgresql 底层存储管理方式:
Postgresql的每个数据库均存放在一个目录中,以db_oid命名,该目录中存放每个表对应的文件,文件名以该数据表对应的relfilenode_oid命名。当表中的数据量足够大,导致表文件的大小大于1GB的时候,postgresql会自动创建新的文件用于存放新插入的数据。新文件的名称为: relfilenode_iod.1, relfilenode_iod.2 等。使用该策略是为了防止在某些文件系统中,最大支持文件尺寸不能大于1GB的情形。
db_oid, relfilenode_oid可以从pg_class系统表中查询得出。
② 如何查PostgreSQL 数据库中所有的表
1、通过命令行查询
\d 数据库 —— 得到所有表的名字
\d 表名 —— 得到表结构
2、通过SQL语句查询
"select * from pg_tables" —— 得到当前db中所有表的信息(这里pg_tables是系统视图)
"select tablename from pg_tables where schemaname='public'" —— 得到所有用户自定义表的名字(这里"tablename"字段是表的名字,"schemaname"是schema的名字。用户自定义的表,如果未经特殊处理,默认都是放在名为public的schema下)
③ PostgreSQL一个数据库最大支持多少个表
这个和表的数量没有关系,要看每个表的大小和你的数据库的大小.一般 表的大小*数量 < 数据库的大小
④ pgsql怎样创建表,数据库等
打开软件,进入界面中。
双击“PostgresSQL 9.3”连接服务器
方法一:右键单击“postgres”,选择“新建对象”--新建数据库,设置新的数据库的参数,所有者一般默认为“postgres”
新建完后,不能立即看到界面上更新的数据,需要点击界面上的更新按钮才能够看到数据库的变化情况。
方法二:在插件中输入SQL语言,运行命令
方法三:点击面板上的“执行任意的SQL查询”
⑤ MySQL与PostgreSQL比较 哪个数据库更好
特性 MySQL PostgreSQL
实例 通过执行 MySQL 命令(mysqld)启动实例。一个实例可以管理一个或多个数据库。一台服务器可以运行多个 mysqld 实例。一个实例管理器可以监视 mysqld 的各个实例。
通过执行 Postmaster 进程(pg_ctl)启动实例。一个实例可以管理一个或多个数据库,这些数据库组成一个集群。集群是磁盘上的一个区域,这个区域在安装时初始化并由一个目录组成,所有数据都存储在这个目录中。使用 initdb 创建第一个数据库。一台机器上可以启动多个实例。
数据库 数据库是命名的对象集合,是与实例中的其他数据库分离的实体。一个 MySQL 实例中的所有数据库共享同一个系统编目。 数据库是命名的对象集合,每个数据库是与其他数据库分离的实体。每个数据库有自己的系统编目,但是所有数据库共享 pg_databases。
数据缓冲区 通过 innodb_buffer_pool_size 配置参数设置数据缓冲区。这个参数是内存缓冲区的字节数,InnoDB 使用这个缓冲区来缓存表的数据和索引。在专用的数据库服务器上,这个参数最高可以设置为机器物理内存量的 80%。 Shared_buffers 缓存。在默认情况下分配 64 个缓冲区。默认的块大小是 8K。可以通过设置 postgresql.conf 文件中的 shared_buffers 参数来更新缓冲区缓存。
数据库连接 客户机使用 CONNECT 或 USE 语句连接数据库,这时要指定数据库名,还可以指定用户 id 和密码。使用角色管理数据库中的用户和用户组。 客户机使用 connect 语句连接数据库,这时要指定数据库名,还可以指定用户 id 和密码。使用角色管理数据库中的用户和用户组。
身份验证 MySQL 在数据库级管理身份验证。 基本只支持密码认证。 PostgreSQL 支持丰富的认证方法:信任认证、口令认证、Kerberos 认证、基于 Ident 的认证、LDAP 认证、PAM 认证
加密 可以在表级指定密码来对数据进行加密。还可以使用 AES_ENCRYPT 和 AES_DECRYPT 函数对列数据进行加密和解密。可以通过 SSL 连接实现网络加密。 可以使用 pgcrypto 库中的函数对列进行加密/解密。可以通过 SSL 连接实现网络加密。
审计 可以对 querylog 执行 grep。 可以在表上使用 PL/pgSQL 触发器来进行审计。
查询解释 使用 EXPLAIN 命令查看查询的解释计划。 使用 EXPLAIN 命令查看查询的解释计划。
备份、恢复和日志 InnoDB 使用写前(write-ahead)日志记录。支持在线和离线完全备份以及崩溃和事务恢复。需要第三方软件才能支持热备份。 在数据目录的一个子目录中维护写前日志。支持在线和离线完全备份以及崩溃、时间点和事务恢复。 可以支持热备份。
JDBC 驱动程序 可以从 参考资料 下载 JDBC 驱动程序。 可以从 参考资料 下载 JDBC 驱动程序。
表类型 取决于存储引擎。例如,NDB 存储引擎支持分区表,内存引擎支持内存表。 支持临时表、常规表以及范围和列表类型的分区表。不支持哈希分区表。 由于PostgreSQL的表分区是通过表继承和规则系统完成了,所以可以实现更复杂的分区方式。
索引类型 取决于存储引擎。MyISAM:BTREE,InnoDB:BTREE。 支持 B-树、哈希、R-树和 Gist 索引。
约束 支持主键、外键、惟一和非空约束。对检查约束进行解析,但是不强制实施。 支持主键、外键、惟一、非空和检查约束。
存储过程和用户定义函数 支持 CREATE PROCEDURE 和 CREATE FUNCTION 语句。存储过程可以用 SQL 和 C++ 编写。用户定义函数可以用 SQL、C 和 C++ 编写。 没有单独的存储过程,都是通过函数实现的。用户定义函数可以用 PL/pgSQL(专用的过程语言)、PL/Tcl、PL/Perl、PL/Python 、SQL 和 C 编写。
触发器 支持行前触发器、行后触发器和语句触发器,触发器语句用过程语言复合语句编写。 支持行前触发器、行后触发器和语句触发器,触发器过程用 C 编写。
系统配置文件 my.conf Postgresql.conf
数据库配置 my.conf Postgresql.conf
客户机连接文件 my.conf pg_hba.conf
XML 支持 有限的 XML 支持。 有限的 XML 支持。
数据访问和管理服务器 OPTIMIZE TABLE —— 回收未使用的空间并消除数据文件的碎片
myisamchk -analyze —— 更新查询优化器所使用的统计数据(MyISAM 存储引擎)
mysql —— 命令行工具
MySQL Administrator —— 客户机 GUI 工具 Vacuum —— 回收未使用的空间
Analyze —— 更新查询优化器所使用的统计数据
psql —— 命令行工具
pgAdmin —— 客户机 GUI 工具
并发控制 支持表级和行级锁。InnoDB 存储引擎支持 READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ 和 SERIALIZABLE。使用 SET TRANSACTION ISOLATION LEVEL 语句在事务级设置隔离级别。 支持表级和行级锁。支持的 ANSI 隔离级别是 Read Committed(默认 —— 能看到查询启动时数据库的快照)和 Serialization(与 Repeatable Read 相似 —— 只能看到在事务启动之前提交的结果)。使用 SET TRANSACTION 语句在事务级设置隔离级别。使用 SET SESSION 在会话级进行设置。
MySQL相对于PostgreSQL的劣势:
MySQL
PostgreSQL
最重要的引擎InnoDB很早就由Oracle公司控制。目前整个MySQL数据库都由Oracle控制。
BSD协议,没有被大公司垄断。
对复杂查询的处理较弱,查询优化器不够成熟
很强大的查询优化器,支持很复杂的查询处理。
只有一种表连接类型:嵌套循环连接(nested-loop),不支持排序-合并连接(sort-merge join)与散列连接(hash join)。
都支持
性能优化工具与度量信息不足
提供了一些性能视图,可以方便的看到发生在一个表和索引上的select、delete、update、insert统计信息,也可以看到cache命中率。网上有一个开源的pgstatspack工具。
InnoDB的表和索引都是按相同的方式存储。也就是说表都是索引组织表。这一般要求主键不能太长而且插入时的主键最好是按顺序递增,否则对性能有很大影响。
不存在这个问题。
大部分查询只能使用表上的单一索引;在某些情况下,会存在使用多个索引的查询,但是查询优化器通常会低估其成本,它们常常比表扫描还要慢。
不存在这个问题
表增加列,基本上是重建表和索引,会花很长时间。
表增加列,只是在数据字典中增加表定义,不会重建表
存储过程与触发器的功能有限。可用来编写存储过程、触发器、计划事件以及存储函数的语言功能较弱
除支持pl/pgsql写存储过程,还支持perl、python、Tcl类型的存储过程:pl/perl,pl/python,pl/tcl。
也支持用C语言写存储过程。
不支持Sequence。
支持
不支持函数索引,只能在创建基于具体列的索引。
不支持物化视图。
支持函数索引,同时还支持部分数据索引,通过规则系统可以实现物化视图的功能。
执行计划并不是全局共享的, 仅仅在连接内部是共享的。
执行计划共享
MySQL支持的SQL语法(ANSI SQL标准)的很小一部分。不支持递归查询、通用表表达式(Oracle的with 语句)或者窗口函数(分析函数)。
都 支持
不支持用户自定义类型或域(domain)
支持。
对于时间、日期、间隔等时间类型没有秒以下级别的存储类型
可以精确到秒以下。
身份验证功能是完全内置的,不支持操作系统认证、PAM认证,不支持LDAP以及其它类似的外部身份验证功能。
支持OS认证、Kerberos 认证 、Ident 的认证、LDAP 认证、PAM 认证
不支持database link。有一种叫做Federated的存储引擎可以作为一个中转将查询语句传递到远程服务器的一个表上,不过,它功能很粗糙并且漏洞很多
有dblink,同时还有一个dbi-link的东西,可以连接到oracle和mysql上。
Mysql Cluster可能与你的想象有较大差异。开源的cluster软件较少。
复制(Replication)功能是异步的,并且有很大的局限性.例如,它是单线程的(single-threaded),因此一个处理能力更强的Slave的恢复速度也很难跟上处理能力相对较慢的Master.
有丰富的开源cluster软件支持。
explain看执行计划的结果简单。
explain返回丰富的信息。
类似于ALTER TABLE或CREATE TABLE一类的操作都是非事务性的.它们会提交未提交的事务,并且不能回滚也不能做灾难恢复
DDL也是有事务的。
PostgreSQL主要优势:
1. PostgreSQL完全免费,而且是BSD协议,如果你把PostgreSQL改一改,然后再拿去卖钱,也没有人管你,这一点很重要,这表明了PostgreSQL数据库不会被其它公司控制。oracle数据库不用说了,是商业数据库,不开放。而MySQL数据库虽然是开源的,但现在随着SUN被oracle公司收购,现在基本上被oracle公司控制,其实在SUN被收购之前,MySQL中最重要的InnoDB引擎也是被oracle公司控制的,而在MySQL中很多重要的数据都是放在InnoDB引擎中的,反正我们公司都是这样的。所以如果MySQL的市场范围与oracle数据库的市场范围冲突时,oracle公司必定会牺牲MySQL,这是毫无疑问的。
2. 与PostgreSQl配合的开源软件很多,有很多分布式集群软件,如pgpool、pgcluster、slony、plploxy等等,很容易做读写分离、负载均衡、数据水平拆分等方案,而这在MySQL下则比较困难。
3. PostgreSQL源代码写的很清晰,易读性比MySQL强太多了,怀疑MySQL的源代码被混淆过。所以很多公司都是基本PostgreSQL做二次开发的。
4. PostgreSQL在很多方面都比MySQL强,如复杂SQL的执行、存储过程、触发器、索引。同时PostgreSQL是多进程的,而MySQL是线程的,虽然并发不高时,MySQL处理速度快,但当并发高的时候,对于现在多核的单台机器上,MySQL的总体处理性能不如PostgreSQL,原因是MySQL的线程无法充分利用CPU的能力。
目前只想到这些,以后想到再添加,欢迎大家拍砖。
PostgreSQL与oracle或InnoDB的多版本实现的差别
PostgreSQL与oracle或InnoDB的多版本实现最大的区别在于最新版本和历史版本是否分离存储,PostgreSQL不分,而oracle和InnoDB分,而innodb也只是分离了数据,索引本身没有分开。
PostgreSQL的主要优势在于:
1. PostgreSQL没有回滚段,而oracle与innodb有回滚段,oracle与Innodb都有回滚段。对于oracle与Innodb来说,回滚段是非常重要的,回滚段损坏,会导致数据丢失,甚至数据库无法启动的严重问题。另由于PostgreSQL没有回滚段,旧数据都是记录在原先的文件中,所以当数据库异常crash后,恢复时,不会象oracle与Innodb数据库那样进行那么复杂的恢复,因为oracle与Innodb恢复时同步需要redo和undo。所以PostgreSQL数据库在出现异常crash后,数据库起不来的几率要比oracle和mysql小一些。
2. 由于旧的数据是直接记录在数据文件中,而不是回滚段中,所以不会象oracle那样经常报ora-01555错误。
3. 回滚可以很快完成,因为回滚并不删除数据,而oracle与Innodb,回滚时很复杂,在事务回滚时必须清理该事务所进行的修改,插入的记录要删除,更新的记录要更新回来(见row_undo函数),同时回滚的过程也会再次产生大量的redo日志。
4. WAL日志要比oracle和Innodb简单,对于oracle不仅需要记录数据文件的变化,还要记录回滚段的变化。
PostgreSQL的多版本的主要劣势在于:
1、最新版本和历史版本不分离存储,导致清理老旧版本需要作更多的扫描,代价比较大,但一般的数据库都有高峰期,如果我们合理安排VACUUM,这也不是很大的问题,而且在PostgreSQL9.0中VACUUM进一步被加强了。
2、由于索引中完全没有版本信息,不能实现Coverage index scan,即查询只扫描索引,直接从索引中返回所需的属性,还需要访问表。而oracle与Innodb则可以;
进程模式与线程模式的对比
PostgreSQL和oracle是进程模式,MySQL是线程模式。
进程模式对多CPU利用率比较高。
进程模式共享数据需要用到共享内存,而线程模式数据本身就是在进程空间内都是共享的,不同线程访问只需要控制好线程之间的同步。
线程模式对资源消耗比较少。
所以MySQL能支持远比oracle多的更多的连接。
对于PostgreSQL的来说,如果不使用连接池软件,也存在这个问题,但PostgreSQL中有优秀的连接池软件软件,如pgbouncer和pgpool,所以通过连接池也可以支持很多的连接。
⑥ 在postgresql中如何从数据库中检索出所有的表名
1、查看当前数据库中所有的模式。
⑦ pg数据库的db怎么查看表关联
一、数据库的多表连接查询,inner的不同用法
在pg数据库中建立两张表:
t_a和t_b如下所示:
t_a:
t_b:
1、inner join(内连接)
inner join就是根据on字段标示出来的条件,查询关联的表中符合条件的数据,并把他前部都显示出来,形成一个结果集。
执行如下语句:
select * from t_a inner join t_b on t_a.adi=t_b.bid
得到的结果为:
这样的查询会显示出所有的数据,如果我们仅仅需要一部分的数据(例如我们只想查出t_a中所有aid和t_b中的bid相同的数据),那么查询语句应该变成:
select t_a.* from t_a inner join t_b on t_a.aid=t_b.bid
那么得到的数据如下所示,就只显示了t_a表中的数据。如下:
要排除重复的数据,在select后加distinct即可。
2、left join
left join 就是以表t_a为基础从右表t_b中查询出所有符合on条件的结果,在合并到表t_a中对应的部分,再作为一个结果集输出,在结果集中,会显示出表t_a中的所有数据。
执行如下查询语句:
select * from t_a left join t_b on t_a.aid=t_b.bid
得到如下结果:
可以看到,在查询的结果中,有一行关于表t_b的数据都为null,因为表t_b中没有符合on条件的数据。但是表t_a表显示出了全部的数据。那么在需要筛选的时候,应该着重于筛选表t_b中的数据,如果执行如下的语句:
select t_a.* from t_a left join t_b on t_a.aid=t_b.bid
那么得到的就是表t_a中的所有数据,那么这个查询就显得没有意义了。
3、right join
right join 就是以表t_b为基础从左表t_a中查询出所有符合on条件的结果,在合并到表t_b中对应的部分,再作为一个结果集输出,在结果集中,会显示出表t_b中的所有数据。
执行如下查询语句:
select * from t_a right join t_b on t_a.aid=t_b.bid
得到的结果为:
可以看到,查询的结果中,有两行数据在表t_a的对应部分都是null的,表示表t_a中没有符合on条件的数据,但是表t_b显示了全部的数据,那么需要做条件筛选的时候,我们就应该主要针对表t_a进行筛选。
二、查询一个父级的所有子级(包括子级的子级)
在pg数据库中建立一张表t_c如下:
要查出cid为1的所有的子级、包括cid为2、3、5的子级的集合。执行以下sql语句
with recursive tb as(select * from t_c where parent_id='1' union all select t_c.* from t_c,tb where t_c.parent_id=tb.cid )select * from tb
得到如下的结果:
由查询出的结果集可以看到,我们查询出了除了父级(cid为1)以外的所有cid为父级的子级以及子级的子级。
我们来解析一下这个sql语句:
显而易见的,这是一个递归的查询方法。首先是with为查询语句提供了辅助功能,可以看做是查询语句中的临时表,其次recursive是sql中递归的关键字,只有有了这个关键字,pg才知道with这个语句需要做递归操作。union all是去重的,t_c.parent_id=tb.cid 表示了t_c的parent_id要等于临时表tb的cid要在整个with语句的外面查询建立的临时表tb,才能得到所有的子级的集合。
⑧ PG里如何查看表,索引,表空间,数据库大小
--查询一个索引大小 select pg_size_pretty(pg_relation_size('indexname))--查看一张表及此它上的索引总大小 select pg_size_pretty(pg_total_relation_size('tablename')); --查看所有 schema里面索引大小,大到小的顺序排列: select indexrelname,pg_size_pretty( pg_relation_size(relid)) from pg_stat_user_indexes where schemaname = 'schemaname' order by pg_relation_size(relid) desc;--查看所有 schema里面表的大小,从大到小顺序排列: select relname, pg_size_pretty(pg_relation_size(relid)) from pg_stat_user_tables where schemaname = 'schemaname' order by pg_relation_size(relid) desc; --查看数据库大小: select pg_database.datname,pg_size_pretty(pg_database_size(pg_database.datname)) AS size from pg_database;--查看表空间大小