pg_total_relation_s...
 
通知
清除全部

pg_total_relation_size()统计表的大小问题


changdan1111
帖子: 2
Topic starter
初出茅庐
已加入: 3年 前

select schemaname,tablename,round(sum(pg_total_relation_size(schemaname || '.' || partitiontablename)::numeric)/1024/1024,2) "MB" 
  from pg_partitions
  where tablename='a_mro_maxcoverage_lte_cell_d'
  group by 1,2;

使用该sql统计表的大小:

'edw_app','a_mro_maxcoverage_lte_cell_d','5322.85'

 

insert into edw_dev.tmp_cd_11 或者 create table edw_dev.tmp_cd_11  as
select schemaname,tablename,round(sum(pg_total_relation_size(schemaname || '.' || partitiontablename)::numeric)/1024/1024,2) "MB" 
  from pg_partitions
  where tablename='a_mro_maxcoverage_lte_cell_d'
  group by 1,2;

同样执行把结果插入结构表数据就变了:

'edw_app','a_mro_maxcoverage_lte_cell_d','20.63'

 

为什么会有这样的结果呢?

2 回复
kainwen
帖子: 4
初出茅庐
已加入: 3年 前

贴一下你单独查询的查询计划,以及你create table as的查询计划。

回复
water32
帖子: 8
Greenplum专家
青梅新星
已加入: 3年 前

两者的执行计划并不相同,问题的本质是,直接select,计算尺寸的函数是在Master上执行的,函数本身会自动计算所有计算实例的尺寸并进行汇总,在insert中,因为insert的目标表是分布式的,计算尺寸的 函数可能会到计算节点去执行,得到的结果自然就不是全集群的尺寸,而只是个别实例的尺寸,这种函数是不能这样使用的,看执行计划!

回复
Close Bitnami banner
Bitnami