2015-09-28 1 views
0

Merci d'avance pour toute aide à ce sujet, il est très apprécié. Donc, en gros, j'ai une base de données Greenplum et je veux sélectionner la taille de la table pour les 10 plus grandes tables. Ce n'est pas un problème avec le ci-dessous:PSQL - Sélectionnez la taille des tables pour à la fois partitionné et normal

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 
; 

Cependant j'ai plusieurs tables partitionnées dans ma base de données et montrent avec sql ci-dessus tous leurs fendit 'tables enfants de en petits fragments (bien que je sais ils s'accumulent pour faire les 2 plus grandes tables). Existe-t-il un moyen de créer un script qui sélectionne des tables (partitionnées ou non) et leur taille totale?

Note: Je serais heureux d'inclure une sorte de jointure où je spécifie le nom de table partitoned spécifiquement car il y a seulement 2 tables partitionnées. Cependant, je devrais toujours prendre le top 10 (où je ne peux pas supposer que les tables partitionnées sont là-haut) et je ne peux pas spécifier d'autres noms de table puisqu'il y en a près d'un millier.

Merci encore, Vinny.

Répondre

0

Vos amis seront fonction pg_relation_size() pour obtenir la taille de la relation et vous sélectionnerez pg_class, pg_namespace et pg_partition les réunir comme ceci:

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;