2015-09-28 6 views
0

Заранее спасибо за любую помощь в этом, мы высоко ценим.PSQL - выберите размер таблиц как для секционированных, так и для нормальных

Итак, у меня есть база данных Greenplum, и я хочу выбрать размер таблицы для 10 самых больших таблиц. Это не проблема, используя ниже:

select 
sotaidschemaname schema_name 
,sotaidtablename table_name 
,pg_size_pretty(sotaidtablesize) table_size 
from gp_toolkit.gp_size_of_table_and_indexes_disk 
order by 3 desc 
limit 10 
; 

Однако у меня есть несколько секционированных таблиц в моей базе данных, и они отображаются с выше SQL, как раскол всех своих «дочерних таблиц» на небольшие фрагменты (хотя я знаю, они накапливают, чтобы сделать самые большие 2 таблицы). Есть ли способ сделать скрипт, который выбирает таблицы (разделенные или другие) и их общий размер?

Примечание: Я был бы рад включить какое-то соединение, где я укажу партикуемое имя таблицы, так как есть только 2 секционированных таблицы. Тем не менее, мне все равно нужно будет занять 10-е место (где я не могу предположить, что секционированная таблица находится там), и я не могу указать какие-либо другие имена таблиц, так как их около тысячи.

Еще раз спасибо, Vinny.

ответ

0

Ваших друзья будут pg_relation_size функции() для получения размера отношения и вы бы выбрали pg_class, pg_namespace и pg_partition соединив их вместе, как это:

select schemaname, 
     tablename, 
     sum(size_mb) as size_mb, 
     sum(num_partitions) as num_partitions 
    from (
     select coalesce(p.schemaname, n.nspname) as schemaname, 
       coalesce(p.tablename, c.relname) as tablename, 
       1 as num_partitions, 
       pg_relation_size(n.nspname || '.' || c.relname)/1000000. as size_mb 
      from pg_class as c 
       inner join pg_namespace as n on c.relnamespace = n.oid 
       left join pg_partitions as p on c.relname = p.partitiontablename and n.nspname = p.partitionschemaname  
     ) as q 
    group by 1, 2 
    order by 3 desc 
    limit 10; 
0
select * from 
(  
select schemaname,tablename, 
pg_relation_size(schemaname||'.'||tablename) as Size_In_Bytes 
from pg_tables 
where schemaname||'.'||tablename not in (select schemaname||'.'||partitiontablename from pg_partitions) 
and schemaname||'.'||tablename not in (select distinct schemaname||'.'||tablename from pg_partitions) 

union all 

select schemaname,tablename, 
sum(pg_relation_size(schemaname||'.'||partitiontablename)) as Size_In_Bytes 
from pg_partitions 
group by 1,2) as foo 

where Size_In_Bytes >= '0' order by 3 desc;