PostgreSQL中的TOAST的内容是存储在另一个object中的,与原表的OID不一样。比较像Oracle中的LOB类型存储,(默认使用 out-of-line storage 是存储在lobsegment里的, Inline Storage 存储在表的空间里)。
如果表中有某些字段使用TOAST进行存储,那么,通过普通的pg_relation_size('表名')查询不到TOAST字段所占用的空间。如果要查询TOAST字段所占用的空间,可以先查询出TOAST字段对应的OID,再通过pg_relation_size(OID)的方式查询出TOAST字段所占用的空间。
--以下实验验证pg_relation_size('表名')查询不到TOAST字段所占用的空间
testdb=> create table t(id int, remark text);
CREATE TABLE
testdb=> insert into t(id) select random() * 100 from generate_series(1,500);
INSERT 0 500
testdb=> select oid,relname,reltoastrelid from pg_class where relname = 't';
oid | relname | reltoastrelid
-------+---------+---------------
24679 | t | 24682
(1 row)
testdb=> select pg_size_pretty(pg_relation_size(24679));
pg_size_pretty
----------------
24 kB
(1 row)
testdb=> select pg_size_pretty(pg_relation_size(24682));
pg_size_pretty
----------------
0 bytes
(1 row)
TOAST字段所占用的空间现在是0
testdb=> select pg_size_pretty(pg_total_relation_size('t'));
pg_size_pretty
----------------
56 kB
(1 row)
testdb=> insert into t(remark) select repeat(md5(random()::text), 10000) from generate_series(1,1000);
INSERT 0 1000
testdb=> select pg_size_pretty(pg_relation_size(24679));
pg_size_pretty
----------------
72 kB
(1 row)
testdb=> select pg_size_pretty(pg_relation_size(24682));
pg_size_pretty
----------------
4000 kB
(1 row)
TOAST字段所占用的空间已经变为4000kB
testdb=> select pg_size_pretty(pg_total_relation_size('t'));
pg_size_pretty
----------------
4184 kB
(1 row)
使用pg_total_relation_size查出的结果是包括TOAST字段所占用的空间的。
testdb=> create index idx_id_id on t(id);
CREATE INDEX
testdb=> select pg_size_pretty(pg_relation_size(24679));
pg_size_pretty
----------------
72 kB
(1 row)
testdb=> select pg_size_pretty(pg_relation_size(24682));
pg_size_pretty
----------------
4000 kB
(1 row)
testdb=> select pg_size_pretty(pg_total_relation_size('t'));
pg_size_pretty
----------------
4240 kB
(1 row)
增加索引后,OID为24679和24682的大小都不变,而pg_total_relation_size的大小增加了,所以pg_total_relation_size的大小是包括了索引所占用的空间的。
------------------------------------华丽丽的分割线------------------------------------
Ubuntu Server 14.04 下安装 PostgreSQL 9.3.5 数据库
CentOS 6.3环境下yum安装PostgreSQL 9.3
Ubuntu下LAPP(Linux+Apache+PostgreSQL+PHP)环境的配置与安装
PostgreSQL配置Streaming Replication集群
如何在CentOS 7/6.5/6.4 下安装PostgreSQL 9.3 与 phpPgAdmin
------------------------------------华丽丽的分割线------------------------------------