¿Cómo puedo enumerar todas las tablas de una base de datos PostgreSQL y ordenarlas por tamaño ?
¿Cómo puedo enumerar todas las tablas de una base de datos PostgreSQL y ordenarlas por tamaño ?
Respuestas:
select table_name, pg_relation_size(quote_ident(table_name))
from information_schema.tables
where table_schema = 'public'
order by 2
Esto le muestra el tamaño de todas las tablas en el esquema public
si tiene varios esquemas, es posible que desee utilizar:
select table_schema, table_name, pg_relation_size('"'||table_schema||'"."'||table_name||'"')
from information_schema.tables
order by 3
Ejemplo de SQLFiddle: http://sqlfiddle.com/#!15/13157/3
Lista de todas las funciones de tamaño de objeto en el manual .
select table_schema, table_name, pg_relation_size(table_schema||'.'||table_name) from information_schema.tables order by 3;
gracias por la ayuda!
select * from information_schema.tables where table_schema = 'public';
produce cero filas aunque \dn
muestra el esquema público. ¿Quizás un cambio en 9.5 causó esto?
Esto le mostrará el nombre del esquema, el nombre de la tabla, el tamaño bonito y el tamaño (necesario para ordenar).
SELECT
schema_name,
relname,
pg_size_pretty(table_size) AS size,
table_size
FROM (
SELECT
pg_catalog.pg_namespace.nspname AS schema_name,
relname,
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
WHERE schema_name NOT LIKE 'pg_%'
ORDER BY table_size DESC;
Construyo esto en base a las soluciones de esta lista de esquemas con tamaños (relativos y absolutos) en una base de datos PostgreSQL
Esto quedará más claro.
pg_size_pretty(<numeric_value>)
- convierte el número de bytes a formato legible por humanos.
pg_database_size(<db_name>)
- obtiene el tamaño de la base de datos en bytes .
pg_total_relation_size(<relation_name>)
- obtiene el tamaño total de la tabla y su índice en bytes .
pg_relation_size(<relation_name>)
- obtiene el tamaño de la relación (tabla / índice) en bytes .
pg_index_size(<relation_name>)
- obtiene el tamaño del índice de la relación en bytes .
current_database()
: obtiene la base de datos utilizada actualmente en la que se realiza esta consulta.
Consulta:
select current_database() as database,
pg_size_pretty(total_database_size) as total_database_size,
schema_name,
table_name,
pg_size_pretty(total_table_size) as total_table_size,
pg_size_pretty(table_size) as table_size,
pg_size_pretty(index_size) as index_size
from ( select table_name,
table_schema as schema_name,
pg_database_size(current_database()) as total_database_size,
pg_total_relation_size(table_name) as total_table_size,
pg_relation_size(table_name) as table_size,
pg_indexes_size(table_name) as index_size
from information_schema.tables
where table_schema=current_schema() and table_name like 'table_%'
order by total_table_size
) as sizes;
Resultado:
database | total_database_size | schema_name | table_name | total_table_size | table_size | index_size
-----------+---------------------+-------------+------------+------------------+------------+------------
vigneshdb | 1586 MB | corpdata | table_aaa | 16 kB | 0 bytes | 8192 bytes
vigneshdb | 1586 MB | corpdata | table_bbb | 24 kB | 0 bytes | 16 kB
vigneshdb | 1586 MB | corpdata | table_ccc | 640 kB | 112 kB | 488 kB
vigneshdb | 1586 MB | corpdata | table_ddd | 9760 kB | 3152 kB | 6568 kB
vigneshdb | 1586 MB | corpdata | table_eee | 1120 MB | 311 MB | 808 MB
El formato humanizado se representan en bytes
, kB
, MB
,GB
, y TB
.
bytes
a kB
- comienza desde10240 bytes
bytes
a MB
- comienza desde 10485248 bytes
=10239.5 kB
~10 MB
bytes
a GB
- comienza desde 10736893952 bytes
=10239.5 MB
~10 BG
bytes
a TB
- comienza desde10994579406848 bytes
=10239.5 GB
~10 TB
Todas las conversiones de unidades comienzan desde 10 + <unit>
.
Para referencia - Documentación oficial de Postgres
SELECT
relname as "Table",
pg_size_pretty(pg_total_relation_size(relid)) As "Size",
pg_size_pretty(pg_total_relation_size(relid) - pg_relation_size(relid)) as "External Size"
FROM pg_catalog.pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC;
tomado de aquí https://wiki-bsse.ethz.ch/display/ITDOC/Check+size+of+tables+and+objects+in+PostgreSQL+database
select table_name,n_live_tup, pg_size_pretty(pg_relation_size(table_name))
from information_schema.tables
inner join pg_stat_user_tables on table_name=relname
where table_schema = 'public'
order by 2 desc
Otra alternativa
Necesitaba encontrar qué tablas usan más espacio.
Basado en otras respuestas, utilicé esa consulta:
select table_name, pg_size_pretty( pg_relation_size(quote_ident(table_name)) )
from information_schema.tables
where table_schema = 'public'
order by pg_relation_size(quote_ident(table_name)) desc
Obtengo el siguiente resultado:
table_name pg_size_pretty
--------------------------------------
trade_binance 96 GB
closs_v2_binance_stash 46 GB
closs_bitfinex_stash 5725 MB
trade_bitfinex 5112 MB
...
api_requests 0 bytes
trade_huobi 0 bytes
Debería haber comprado un SSD más grande.
select uv.a tablename, pg_size_pretty(uv.b) sizepretty
from (select tb.tablename a, pg_table_size('schemaname.'||tb.tablename::text) b
from pg_tables tb
where tb.schemaname ilike 'schemaname'
order by 2 desc
) uv
\d+
le mostrará esta información, aunque sin clasificar.