在使用greenplum數據庫的時候,有的時候想要查看表所占用空間的大小,會使用如下二個函數pg_relation_size和pg_size_pretty.
前者用來查看數據大小,后者是human readable的調整.方法如下:
select pg_size_pretty(pg_relation_size('relation_name')) ;
select pg_size_pretty(pg_relation_size(oid)) ;
但是,對於分區表而言,這個方法就沒有用了,會發現使用后表的大小為0bytes.原因在於:GP的分區表的主表只是一個表定義,其實際數據內容存儲在繼承父表的分區子表里面了.上網查了一下,沒發現有相應的函數,干脆寫了個函數來實現.
--
Function: calc_partition_table(character varying, character varying)
-- DROP FUNCTION calc_partition_table(character varying, character varying);
CREATE OR REPLACE FUNCTION calc_partition_table(v_schemaname character varying, v_tablename character varying)
RETURNS bigint AS
$BODY$
DECLARE
v_calc BIGINT : = 0;
v_total BIGINT : = 0;
v_tbname VARCHAR( 200);
cur_tbname cursor for select schemaname || ' . ' ||partitiontablename as tb from pg_partitions
where schemaname =v_schemaname and tablename =v_tablename;
BEGIN
OPEN cur_tbname;
loop
FETCH cur_tbname into v_tbname;
if not found THEN
exit;
end if;
EXECUTE ' select pg_relation_size( ''' ||v_tbname || ''' ) ' into v_calc;
v_total: =v_total +v_calc;
end loop;
CLOSE cur_tbname;
RETURN v_total;
end;
$BODY$
LANGUAGE plpgsql VOLATILE;
ALTER FUNCTION calc_partition_table( character varying, character varying) OWNER TO gpadmin;
-- DROP FUNCTION calc_partition_table(character varying, character varying);
CREATE OR REPLACE FUNCTION calc_partition_table(v_schemaname character varying, v_tablename character varying)
RETURNS bigint AS
$BODY$
DECLARE
v_calc BIGINT : = 0;
v_total BIGINT : = 0;
v_tbname VARCHAR( 200);
cur_tbname cursor for select schemaname || ' . ' ||partitiontablename as tb from pg_partitions
where schemaname =v_schemaname and tablename =v_tablename;
BEGIN
OPEN cur_tbname;
loop
FETCH cur_tbname into v_tbname;
if not found THEN
exit;
end if;
EXECUTE ' select pg_relation_size( ''' ||v_tbname || ''' ) ' into v_calc;
v_total: =v_total +v_calc;
end loop;
CLOSE cur_tbname;
RETURN v_total;
end;
$BODY$
LANGUAGE plpgsql VOLATILE;
ALTER FUNCTION calc_partition_table( character varying, character varying) OWNER TO gpadmin;