script para obtener el tamaño de cada tabla e indice en Postgresql

Poder determinar como está compuesto el tamaño de una base de datos es una tarea fundamental en el rol de un DBA. Esto te permite identificar posibles errores de diseño o segmentaciones futuras necesarias.

Acontinuación te dejo un script que suele serme útíl cuando trabajo en motores PostgreSQL. En esta caso si bien lo he usado en su versión 16, también aplica para 17 y 18.

SELECT
    n.nspname AS schema_name,
    c.relname AS table_name,
    CASE
        WHEN c.relkind = 'r' THEN 'Tabla'
        WHEN c.relkind = 'i' THEN 'Índice'
        WHEN c.relkind = 'm' THEN 'Vista Materializada'
        ELSE c.relkind::text
    END AS object_type,
    -- Tamaño total (datos + índices) en Megabytes (MB)
    ROUND((pg_total_relation_size(c.oid) / (1024.0 * 1024.0))::numeric, 2) AS total_size_mb,
    -- Tamaño de la porción de datos o del índice en Megabytes (MB)
    ROUND((pg_relation_size(c.oid) / (1024.0 * 1024.0))::numeric, 2) AS data_or_index_size_mb,
    -- Tamaño de los índices asociados (solo para tablas) en Megabytes (MB)
    CASE
        WHEN c.relkind = 'r' THEN ROUND((pg_indexes_size(c.oid) / (1024.0 * 1024.0))::numeric, 2)
        ELSE NULL
    END AS indexes_size_mb,
    c.reltuples::bigint AS row_count
FROM
    pg_class c
LEFT JOIN
    pg_namespace n ON n.oid = c.relnamespace
WHERE
    n.nspname NOT IN ('pg_catalog', 'information_schema', 'pg_toast')
    AND c.relkind IN ('r', 'i', 'm')
ORDER BY
    pg_total_relation_size(c.oid) DESC;
columnadescripción
schema_nameEsquema al que pertenece la tabla o índice.
table_nameNombre de la tabla, índice o vista materializada.
object_typeTipo de objeto (‘Tabla’, ‘Índice’, ‘Vista Materializada’).
total_sizeTamaño total de la relación (datos + índices + TOAST). Para índices es su tamaño.
table_or_index_sizeTamaño de la relación sin sus índices. Para índices, es su tamaño.
indexes_sizeTamaño total de los índices asociados (solo aplica y se muestra para tablas).
row_countConteo de filas de la tabla (es una estimación del catálogo).

Con el script adjunto obtendrás una salida similar a esta: