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'
为什么会有这样的结果呢?
贴一下你单独查询的查询计划,以及你create table as的查询计划。
两者的执行计划并不相同,问题的本质是,直接select,计算尺寸的函数是在Master上执行的,函数本身会自动计算所有计算实例的尺寸并进行汇总,在insert中,因为insert的目标表是分布式的,计算尺寸的 函数可能会到计算节点去执行,得到的结果自然就不是全集群的尺寸,而只是个别实例的尺寸,这种函数是不能这样使用的,看执行计划!