ventajas tutorial sirve que para historia desventajas caracteristicas postgresql

tutorial - Lista de esquemas con tamaños(relativos y absolutos) en una base de datos PostgreSQL



postgresql wikipedia (1)

Estoy buscando una consulta que devuelva un resultado del formulario para cualquier base de datos (consulte el siguiente ejemplo que supone que el espacio total utilizado por la base de datos es de 40 GB)

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

Me las arreglé para confeccionar una lista de espacio usando entidades en la base de datos ordenada por esquema, lo cual ha sido útil, pero obtener un resumen por esquema no parece tan fácil. Vea abajo.

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;

Esto da resultados como

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

Parece que el uso de un operador de agregación como SUM puede ser necesario, sin éxito hasta el momento.

Regards, Faheem


Prueba esto:

SELECT schema_name, sum(table_size), (sum(table_size) / database_size) * 100 FROM ( SELECT pg_catalog.pg_namespace.nspname as schema_name, pg_relation_size(pg_catalog.pg_class.oid) as table_size, sum(pg_relation_size(pg_catalog.pg_class.oid)) over () as database_size FROM pg_catalog.pg_class JOIN pg_catalog.pg_namespace ON relnamespace = pg_catalog.pg_namespace.oid ) t GROUP BY schema_name, database_size


Edición: solo noté que la solución alternativa con la suma de todas las tablas para obtener el tamaño de la base de datos no es necesaria:

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 as schema_name, pg_relation_size(pg_catalog.pg_class.oid) as 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