七叶笔记 » 数据库 » 聊聊PostgreSql table和磁盘文件的映射关系

聊聊PostgreSql table和磁盘文件的映射关系

每张数据表放在datap*下。postgresql集群是通过hash分布到dataap*这种文件下。

在dataap*下的base目录下存储的是数据表

drop table 后,base目录下的该文件就被删除了,因此可以断定 “在postgresql中drop table会释放空间”

补充:postgresql 的table、index物理存储

postgresql 是使用文件系统存储数据的,有时需要找表及索引对应的磁盘文件,就必须了解以下知识点。

非toast情况

查看表对应的操作系统文件.

查看索引对应的操作系统文件.

使用 pg_class 查看

操作系统查看

这个时候做个truncate操作

依次查看

之后再查看 old relfilenode 时已经消失不见了

总结如下:

1、create table、create index 时,pg_class 的 oid 与 relfilenode 相同。

1、truncate table 后,table与index的oid均没有发生变化,但是 relfilenode 发生了变化。

toast 情况

插入4千万行数据,让tmp_t0在磁盘的大小大于1G

下面是查看表及索引对应的存储文件

参考文档:

表 9-83. 数据库对象尺寸函数

pg_column_size 显示用于存储任意独立数据值的空间。

pg_total_relation_size 接受一个表或 TOAST 表的 OID 或名称,并返回该表所使用的总磁盘空间,包括所有相关的索引。这个函数等价于pg_table_size + pg_indexes_size。

pg_table_size 接受一个表的 OID 或名称,并返回该表所需的磁盘空间,但是排除索引(TOAST 空间、空闲空间映射和可见性映射包含在内)

pg_indexes_size 接受一个表的 OID 或名称,并返回附加到该表的所有索引所使用的全部磁盘空间。

pg_database_size 和 pg_tablespace_size 接受一个数据库或表空间的 OID 或名称,并且返回它们所使用的全部磁盘空间。 要使用pg_database_size,你必须具有在指定数据库上的 CONNECT权限(默认会被授予)。要使用pg_tablespace_size, 你必须具有指定表空间上的CREATE权限,除非它是当前数据库的默认表空间。

pg_relation_size 接受一个表、索引或 TOAST 表的 OID 或者名称, 并且返回那个关系的一个分叉所占的磁盘空间的字节尺寸(注意对于大部分目的, 使用更高层的函数pg_total_relation_size或者pg_table_size 会更方便,它们会合计所有分叉的尺寸)。 如果只得到一个参数, 它会返回该关系的主数据分叉的尺寸。提供第二个参数可以指定要检查哪个分叉:

'main'返回该关系主数据分叉的尺寸。

'fsm'返回与该关系相关的空闲空间映射 (见第 65.3 节)的尺寸。

'vm'返回与该关系相关的可见性映射 (见第 65.4 节)的尺寸。

'init'返回与该关系相关的初始化分叉(如果有)的尺寸。

pg_size_pretty 可以用于把其它函数之一的结果格式化成一种人类易读的格式,可以根据情况使用 KB、MB、GB 或者 TB。

pg_size_bytes 可以被用来从人类可读格式的字符串得到其中所表示的字节数。 其输入可能带有的单位包括字节、kB、MB、GB 或者 TB, 并且对输入进行解析时是区分大小写的。如果没有指定单位,会假定单位为字节。

注意:

函数 pg_size_pretty 和 pg_size_bytes 所使用的单位 kB、MB、GB 和 TB 是用 2 的幂而不是 10 的幂来定义,因此 1kB 是 1024 字节, 1MB 是10242 = 1048576字节,以此类推

上述操作表和索引的函数接受一个 regclass 参数,它是该表或索引在 pg_class系统目录中的 OID。你不必手工去查找该 OID,因为 regclass数据类型的输入转换器会为你代劳。只写包围在单引号内的表名, 这样它看起来像一个文字常量。为了与普通SQL名称的处理相兼容, 该字符串将被转换为小写形式,除非其中在表名周围包含双引号。

如果一个 OID 不表示一个已有的对象并且被作为参数传递给了上述函数, 将会返回 NULL。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持七叶笔记。如有错误或未考虑完全的地方,望不吝赐教。

相关文章