网上有很多pg_toast的原理的文章了,但好像还是缺少pg_toast表的查询、回收清理、重新排列及修改存储参数部分的内容,我做下补充,各位如有补充或者指正,还望不吝赐教。
通过以下sql查询pg_toast占用空间:
SELECT relname, relpages
FROM pg_class
WHERE relname LIKE 'pg_toast%';
relpages字段的单位是“页”,默认情况下一页即8KB,除非进行了修改。如果查询出来是100,那就是100*8=800kb。
VACUUM命令清除表中所有不再使用的数据:
--操作前请备份数据库
VACUUM (FULL);
--清除指定表中不再使用的数据
VACUUM (FULL) table_name;
CLUSTER命令重新排列表中的数据:
--操作前请备份数据库
CLUSTER table_name;
因为pg_toast 是系统表,不能直接操作,所以要重新排列pg_toast中的数据,需要重新排列相应的主表。
ALTER TABLE命令修改表的toast_tuple_target值:
--操作前请备份数据库
ALTER TABLE table_name SET (toast_tuple_target = 8192);
这条命令将修改表的最大存储参数,8192字节即8KB,如果数据大于8KB将存储在pg_toast中,默认情况下toast_tuple_target就是8KB;修改toast_tuple_target的值需要特别小心, 因为这会影响到pg_toast的存储空间的使用, 如果设置的值过小可能导致数据更多的存储在pg_toast中,而过大则会导致pg_toast空间浪费