PG/Gauss 查看表大小

举报
张谱继 发表于 2024/05/20 20:16:05 2024/05/20
【摘要】 TOAST 是“ The Oversized-Attribute Storage Technique ”的缩写,主要用于存储一个大字段的值。要理解 TOAST ,我们要先理解页( BLOCK )的概念。在 PG 中,页是数据在文件存储中的基本单位,其大小是固定的且只能在编译期指定,之后无法修改,默认的大小为8 KB 。同时,PG 不允许一行数据跨页存储,那么对于超长的行数据,PG 就会启动 ...

TOAST 是“ The Oversized-Attribute Storage Technique ”的缩写,主要用于存储一个大字段的值。要理解 TOAST ,我们要先理解页( BLOCK )的概念。在 PG 中,页是数据在文件存储中的基本单位,其大小是固定的且只能在编译期指定,之后无法修改,默认的大小为8 KB 。同时,PG 不允许一行数据跨页存储,那么对于超长的行数据,PG 就会启动 TOAST ,具体就是采用压缩和切片的方式。如果启用了切片,实际数据存储在另一张系统表的多个行中,这张表就叫 TOAST 表,这种存储方式叫行外存储。参考链接1, 参考链接2


策略 如果元组 > TOAST_COMPRESSION_THRESHOLD 则压缩 如果元组 > TOAST_TUPLE_THRESHOLD 则存储外线 描述
EXTENDED 是的 是的 默认策略。首先压缩,然后检查是否需要线外存储
MAIN 是的 仅以未压缩形式 首先压缩,如果仍然过大,则移至 TOAST 表而不压缩
EXTERNAL 是的 如果尺寸过大,则始终移动到 TOAST,而不进行压缩。
PLAIN  数据始终保留在主表中。如果元组超过页面大小,则会发生错误。

查询SQL:

select
	nspname,
	relname,
	pg_size_pretty(pg_total_relation_size(c.oid)) as "表总size=b+c",
	pg_size_pretty(pg_table_size(c.oid)) " b:数据 =b1+b2",
	pg_size_pretty(pg_indexes_size(c.oid)) "c:索引",
	pg_size_pretty(pg_relation_size(c.oid)+pg_relation_size(c.oid,'fsm')+pg_relation_size(c.oid,'vm'))  as "b1:数据1=main+fsm+vm", -- main:数据,主要部分,fsm 自由空间映射  vm:可见性映射
	pg_size_pretty(pg_total_relation_size(c.reltoastrelid)) "b2:数据2:toast",
	case c.relkind
		when 'r' then '表'
		when 'v' then '视图'
		when 'm' then '物化视图'
		when 'i' then '索引'
		when 'S' then '序列'
		when 's' then 'special'
		when 'f' then '外表'
		when 'p' then '分区表' -- gauss没有
		when 'I' then '分区表GLOBAL索引'
		when 't' then 'TOAST表'
		when 'c' then '复核类型'
	end as "Type",
	case c.parttype
		when 'p' then '分区'
		when 'n' then '非分区'
		when 'v' then 'HDFS的Value分区表'
	end "分区",
	case 
		when c.relkind = 'r' or c.relkind = 'p' then pg_get_tabledef(c.oid)
		when c.relkind = 'i' or c.relkind = 'I' then pg_get_indexdef(c.oid)
	end def,
	c.oid,
	pg_size_pretty(pg_relation_size(c.oid)+pg_relation_size(c.oid,'fsm')+pg_relation_size(c.oid,'vm'))||' = '||pg_size_pretty(pg_relation_size(c.oid)) ||' + ' ||pg_size_pretty(pg_relation_size(c.oid,'fsm')) ||' + ' || pg_size_pretty(pg_relation_size(c.oid,'vm'))  as "b1:数据1=main+fsm+vm" -- fsm 自由空间映射  vm:可见性映射
from
	pg_class c,
	pg_namespace n
where
	n.oid = c.relnamespace
	and c.relname in ('xxx_table',
	'xxx_index',
	'pg_toast_xxx')
order by
	nspname,
	relname;

改写SQL

SELECT nspname,
       relname,
       pg_size_pretty(pg_total_relation_size(c.oid)) AS "表总size=b+c",
       pg_size_pretty(pg_table_size(c.oid)) " b:数据 =b1+b2",
       pg_size_pretty(pg_indexes_size(c.oid)) "c:索引",
       pg_size_pretty(pg_relation_size(c.oid) + pg_relation_size(c.oid, 'fsm') + pg_relation_size(c.oid, 'vm')) AS "b1:数据1=main+fsm+vm", -- main:数据,主要部分,fsm 自由空间映射  vm:可见性映射
       pg_size_pretty(pg_total_relation_size(c.reltoastrelid)) "b2:数据2:toast",
       kindname AS "Type",
       CASE c.parttype
         WHEN 'p' THEN
          '分区'
         WHEN 'n' THEN
          '非分区'
         WHEN 'v' THEN
          'HDFS的Value分区表'
       END "分区",
       CASE
         WHEN c.relkind = 'r' OR c.relkind = 'p' THEN
          pg_get_tabledef(c.oid)
         WHEN c.relkind = 'i' OR c.relkind = 'I' THEN
          pg_get_indexdef(c.oid)
       END def,
       c.oid,
       pg_size_pretty(pg_relation_size(c.oid) + pg_relation_size(c.oid, 'fsm') +  pg_relation_size(c.oid, 'vm')) || ' = ' ||  pg_size_pretty(pg_relation_size(c.oid)) || ' + ' ||   pg_size_pretty(pg_relation_size(c.oid, 'fsm')) || ' + ' ||   pg_size_pretty(pg_relation_size(c.oid, 'vm')) AS "b1:数据1=main+fsm+vm" -- fsm 自由空间映射  vm:可见性映射
  FROM pg_class c
  JOIN pg_namespace n
    ON c.relnamespace = n.oid
  LEFT JOIN(VALUES('r', '表'),('v', '视图'),('m', '物化视图'),('i', '索引'),('S', '序列'),('s', 'special'),('f', '外表'),('p', '分区表'),('I', '分区表GLOBAL索引'),('t', 'TOAST表'),('c', '复核类型')) AS kind(kind, kindname)
    ON kind = relkind
 WHERE c.relname IN ('xxx_table', 'xxx_index', 'pg_toast_xxx')
 ORDER BY nspname, relname;
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。