Postgresql lista y ordena tablas por tamaño

109

¿Cómo puedo enumerar todas las tablas de una base de datos PostgreSQL y ordenarlas por tamaño ?

nada-especial-aqui
fuente
1
Si está utilizando el cliente psql de línea de comandos, un simple \d+le mostrará esta información, aunque sin clasificar.
cdhowie
1
Gracias. Pero lo necesito ordenado, tengo demasiadas tablas.
nada-especial-aquí
1
Personas que buscan lo mismo pero bases de datos en lugar de tablas: aquí está la solución .
Skippy le Grand Gourou
1
Re psql: inícielo con --echo-hidden y le dirá las consultas realizadas para \ d + y otros comandos de barra invertida. Fácil de agregar clasificación.
Jürgen Strobel

Respuestas:

149
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 publicsi 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 .

un caballo sin nombre
fuente
Es esquema_tabla, no nombre_esquema. La primera consulta estuvo bien, pero ya había comenzado a escribir algo en su sesión psql, lo que provocó un error de sintaxis.
produce falsedad
OK, este código funciona: ¡ select table_schema, table_name, pg_relation_size(table_schema||'.'||table_name) from information_schema.tables order by 3; gracias por la ayuda!
nada-especial-aquí
¿Alguna idea de lo que esto no funciona en mi caso? stackoverflow.com/questions/40977776/…
Juan Carlos Oropeza
@Sucrenoir: "no funciona" no es un mensaje de error de Postgres válido. La consulta en mi respuesta me funciona: rextester.com/KGKPR49004
a_horse_with_no_name
Obtengo cero filas cuando ejecuto la primera consulta. select * from information_schema.tables where table_schema = 'public';produce cero filas aunque \dnmuestra el esquema público. ¿Quizás un cambio en 9.5 causó esto?
perro pastor
71

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

Kuchi
fuente
21

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

bytesa MB- comienza desde 10485248 bytes=10239.5 kB ~10 MB

bytesa GB- comienza desde 10736893952 bytes=10239.5 MB ~10 BG

bytesa 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

Vignesh Raja
fuente
Este ejemplo no funciona con nombres de tablas en mayúsculas
Ivan Sveshnikov
4
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

Lauri Lüüs
fuente
2

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.

Benjamin Crouzier
fuente
1
 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
Espiga
fuente
1
Su respuesta sería más valiosa si incluye una explicación de por qué el enfoque sugerido es útil.
Cindy Meister
Es similar a la respuesta del caballo, simplemente ordenando por tamaño con bonito, ya que la vista de ordenación será fácil de ver.
Spike
Agregue ese texto a su respuesta, utilizando el enlace Editar en el espacio "Respuesta". Luego, su contribución se ajustará a las pautas de StackOverflow (lea un poco en el Centro de ayuda) :-)
Cindy Meister