it-swarm-eu.dev

liste de schémas avec des tailles (relatives et absolues) dans une base de données PostgreSQL

Je recherche une requête qui renvoie un résultat du formulaire pour n'importe quelle base de données (voir l'exemple ci-dessous en supposant que l'espace total utilisé par la base de données est de 40 Go)

schema | size | relative size
----------+-------------------
foo    | 15GB |   37.5%      
bar    | 20GB |     50%
baz    |  5GB |   12.5%

J'ai réussi à concocter une liste d'espaces en utilisant des entités de la base de données triées par schéma, ce qui a été utile, mais obtenir un résumé par schéma à partir de cela ne semble pas si facile. Voir ci-dessous.

SELECT relkind,
       relname,
       pg_catalog.pg_namespace.nspname,
       pg_size_pretty(pg_relation_size(pg_catalog.pg_class.oid))
FROM   pg_catalog.pg_class
       INNER JOIN pg_catalog.pg_namespace
         ON relnamespace = pg_catalog.pg_namespace.oid
ORDER  BY pg_catalog.pg_namespace.nspname,
          pg_relation_size(pg_catalog.pg_class.oid) DESC;

Cela donne des résultats comme

  relkind |                relname                |      nspname       | pg_size_pretty 
---------+---------------------------------------+--------------------+----------------
  r       | geno                                  | btsnp              | 11 GB
  i       | geno_pkey                             | btsnp              | 5838 MB
  r       | anno                                  | btsnp              | 63 MB
  i       | anno_fid_key                          | btsnp              | 28 MB
  i       | ix_btsnp_anno_rsid                    | btsnp              | 28 MB
  [...]
  r       | anno                                  | btsnp_shard        | 63 MB
  r       | geno4681                              | btsnp_shard        | 38 MB
  r       | geno4595                              | btsnp_shard        | 38 MB
  r       | geno4771                              | btsnp_shard        | 38 MB
  r       | geno4775                              | btsnp_shard        | 38 MB

Il semble que l'utilisation d'un opérateur d'agrégation comme SUM peut être nécessaire, sans succès jusqu'à présent.

                                                                                 Regards, Faheem
31
Faheem Mitha

Essaye ça:

SELECT nom_schéma, 
 Somme (taille_table), 
 (Somme (taille_table)/taille_basededonnées) * 100 
 FROM (
 SELECT pg_catalog.pg_namespace.nspname comme nom_schéma, 
 pg_relation_size (pg_catalog.pg_class.oid) as table_size, 
 sum (pg_relation_size (pg_catalog.pg_class.oid)) sur () as database_size 
 FROM pg_catalog.pg_class 
 JOIN pg_catalog.pg_namespace ON relnamespace = pg_catalog.pg_namespace.oid 
) T 
 GROUP BY nom_schéma, taille_base_de_données


Edit: je viens de remarquer que la solution de contournement consistant à résumer toutes les tables pour obtenir la taille de la base de données n'est pas nécessaire:

 SELECT schema_name, 
 Pg_size_pretty (sum (table_size) :: bigint), 
 (Sum (table_size)/pg_database_size (current_database ())) * 100 
 FROM (
 SELECT pg_catalog.pg_namespace.nspname comme nom_schéma, 
 Pg_relation_size (pg_catalog.pg_class.oid) comme table_size 
 FROM pg_catalog.pg_class 
 JOIN pg_catalog.pg_namespace ON relnamespace = pg_catalog.pg_namespace.oid 
) t 
 GROUP BY schema_name 
 ORDER BY schema_name 
51