在使用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;
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
