F.33. pgstattuple — obtener estadísticas a nivel de tupla #

F.33.1. Funciones
F.33.2. Autores

El módulo pgstattuple proporciona varias funciones para obtener estadísticas a nivel de tupla.

Debido a que estas funciones devuelven información detallada a nivel de página, el acceso está restringido de forma predeterminada. Por defecto, solo el rol pg_stat_scan_tables tiene privilegios de ejecución (EXECUTE). Los superusuarios, por supuesto, omiten esta restricción. Después de que la extensión haya sido instalada, los usuarios pueden emitir comandos GRANT para cambiar los privilegios de las funciones y permitir que otros las ejecuten. Sin embargo, podría ser preferible añadir a esos usuarios al rol pg_stat_scan_tables en su lugar.

F.33.1. Funciones #

pgstattuple(regclass) returns record

pgstattuple devuelve la longitud física de una relación, el porcentaje de tuplas muertas (dead tuples) y otra información. Esto puede ayudar a los usuarios a determinar si es necesario realizar un vacuum o no. El argumento es el nombre de la relación objetivo (opcionalmente calificado por esquema) o su OID. Por ejemplo:

test=> SELECT * FROM pgstattuple('pg_catalog.pg_proc');
-[ RECORD 1 ]------+-------
table_len          | 458752
tuple_count        | 1470
tuple_len          | 438896
tuple_percent      | 95.67
dead_tuple_count   | 11
dead_tuple_len     | 3157
dead_tuple_percent | 0.69
free_space         | 8932
free_percent       | 1.95

Las columnas de salida se describen en la Table F.24.

Table F.24. Columnas de salida de pgstattuple

ColumnaTipoDescripción
table_lenbigintLongitud física de la relación en bytes
tuple_countbigintNúmero de tuplas vivas (live tuples)
tuple_lenbigintLongitud total de las tuplas vivas en bytes
tuple_percentfloat8Porcentaje de tuplas vivas
dead_tuple_countbigintNúmero de tuplas muertas
dead_tuple_lenbigintLongitud total de las tuplas muertas en bytes
dead_tuple_percentfloat8Porcentaje de tuplas muertas
free_spacebigintEspacio libre total en bytes
free_percentfloat8Porcentaje de espacio libre

Note

El valor de table_len siempre será mayor que la suma de tuple_len, dead_tuple_len y free_space. La diferencia se debe a la sobrecarga fija de la página (fixed page overhead), la tabla de punteros a tuplas por página y el relleno (padding) para asegurar que las tuplas estén correctamente alineadas.

pgstattuple adquiere solo un bloqueo de lectura (read lock) en la relación. Por lo tanto, los resultados no reflejan una instantánea exacta; las actualizaciones concurrentes les afectarán.

pgstattuple juzga que una tupla está muerta si HeapTupleSatisfiesDirty devuelve falso.

pgstattuple(text) returns record

Esto es lo mismo que pgstattuple(regclass), excepto que la relación objetivo se especifica como TEXT. Esta función se mantiene por compatibilidad hacia atrás por el momento, y será declarada obsoleta (deprecated) en una versión futura.

pgstatindex(regclass) returns record

pgstatindex devuelve un registro que muestra información sobre un índice B-tree. Por ejemplo:

test=> SELECT * FROM pgstatindex('pg_cast_oid_index');
-[ RECORD 1 ]------+------
version            | 2
tree_level         | 0
index_size         | 16384
root_block_no      | 1
internal_pages     | 0
leaf_pages         | 1
empty_pages        | 0
deleted_pages      | 0
avg_leaf_density   | 54.27
leaf_fragmentation | 0

Las columnas de salida son:

ColumnaTipoDescripción
versionintegerNúmero de versión de B-tree
tree_levelintegerNivel de árbol de la página raíz (root page)
index_sizebigintTamaño total del índice en bytes
root_block_nobigintUbicación de la página raíz (cero si no hay)
internal_pagesbigintNúmero de páginas internas (nivel superior)
leaf_pagesbigintNúmero de páginas hoja (leaf pages)
empty_pagesbigintNúmero de páginas vacías
deleted_pagesbigintNúmero de páginas eliminadas
avg_leaf_densityfloat8Densidad media de las páginas hoja
leaf_fragmentationfloat8Fragmentación de las páginas hoja

El tamaño index_size reportado corresponderá normalmente a una página más de las contabilizadas por la suma de internal_pages + leaf_pages + empty_pages + deleted_pages, debido a que también incluye la metapágina (metapage) del índice.

Al igual que con pgstattuple, los resultados se acumulan página por página, y no se debe esperar que representen una instantánea exacta de todo el índice.

pgstatindex(text) returns record

Esto es lo mismo que pgstatindex(regclass), excepto que el índice objetivo se especifica como TEXT. Esta función se mantiene por compatibilidad hacia atrás por el momento, y será declarada obsoleta en una versión futura.

pgstatginindex(regclass) returns record

pgstatginindex devuelve un registro que muestra información sobre un índice GIN. Por ejemplo:

test=> SELECT * FROM pgstatginindex('test_gin_index');
-[ RECORD 1 ]--+--
version        | 1
pending_pages  | 0
pending_tuples | 0

Las columnas de salida son:

ColumnaTipoDescripción
versionintegerNúmero de versión de GIN
pending_pagesintegerNúmero de páginas en la lista de pendientes (pending list)
pending_tuplesbigintNúmero de tuplas en la lista de pendientes

pgstathashindex(regclass) returns record

pgstathashindex devuelve un registro que muestra información sobre un índice HASH. Por ejemplo:

test=> select * from pgstathashindex('con_hash_index');
-[ RECORD 1 ]--+-----------------
version        | 4
bucket_pages   | 33081
overflow_pages | 0
bitmap_pages   | 1
unused_pages   | 32455
live_items     | 10204006
dead_items     | 0
free_percent   | 61.8005949100872

Las columnas de salida son:

ColumnaTipoDescripción
versionintegerNúmero de versión de HASH
bucket_pagesbigintNúmero de páginas de cubo (bucket pages)
overflow_pagesbigintNúmero de páginas de desbordamiento (overflow pages)
bitmap_pagesbigintNúmero de páginas de mapa de bits
unused_pagesbigintNúmero de páginas no utilizadas
live_itemsbigintNúmero de tuplas vivas
dead_tuplesbigintNúmero de tuplas muertas
free_percentfloatPorcentaje de espacio libre

pg_relpages(regclass) returns bigint

pg_relpages devuelve el número de páginas en la relación.

pg_relpages(text) returns bigint

Esto es lo mismo que pg_relpages(regclass), excepto que la relación objetivo se especifica como TEXT. Esta función se mantiene por compatibilidad hacia atrás por el momento, y será declarada obsoleta en una versión futura.

pgstattuple_approx(regclass) returns record

pgstattuple_approx es una alternativa más rápida a pgstattuple que devuelve resultados aproximados. El argumento es el nombre o OID de la relación objetivo. Por ejemplo:

test=> SELECT * FROM pgstattuple_approx('pg_catalog.pg_proc'::regclass);
-[ RECORD 1 ]--------+-------
table_len            | 573440
scanned_percent      | 2
approx_tuple_count   | 2740
approx_tuple_len     | 561210
approx_tuple_percent | 97.87
dead_tuple_count     | 0
dead_tuple_len       | 0
dead_tuple_percent   | 0
approx_free_space    | 11996
approx_free_percent  | 2.09

Las columnas de salida se describen en la Table F.25.

Mientras que pgstattuple siempre realiza un escaneo completo de la tabla y devuelve un recuento exacto de tuplas vivas y muertas (y sus tamaños) y del espacio libre, pgstattuple_approx intenta evitar el escaneo completo de la tabla y devuelve estadísticas exactas de tuplas muertas junto con una aproximación de la cantidad y el tamaño de las tuplas vivas y del espacio libre.

Hace esto omitiendo las páginas que solo tienen tuplas visibles según el mapa de visibilidad (si una página tiene el bit VM correspondiente activo, se asume que no contiene tuplas muertas). Para tales páginas, obtiene el valor del espacio libre a partir del mapa de espacio libre (FSM), y asume que el resto del espacio en la página está ocupado por tuplas vivas.

Para las páginas que no se pueden omitir, escanea cada tupla, registrando su presencia y tamaño en los contadores correspondientes, y sumando el espacio libre en la página. Al final, estima el número total de tuplas vivas basándose en el número de páginas y tuplas escaneadas (de la misma manera que VACUUM estima pg_class.reltuples).

Table F.25. Columnas de salida de pgstattuple_approx

ColumnaTipoDescripción
table_lenbigintLongitud física de la relación en bytes (exacta)
scanned_percentfloat8Porcentaje de tabla escaneada
approx_tuple_countbigintNúmero de tuplas vivas (estimado)
approx_tuple_lenbigintLongitud total de las tuplas vivas en bytes (estimada)
approx_tuple_percentfloat8Porcentaje de tuplas vivas
dead_tuple_countbigintNúmero de tuplas muertas (exacto)
dead_tuple_lenbigintLongitud total de las tuplas muertas en bytes (exacto)
dead_tuple_percentfloat8Porcentaje de tuplas muertas
approx_free_spacebigintEspacio libre total en bytes (estimado)
approx_free_percentfloat8Porcentaje de espacio libre

En la salida anterior, las cifras de espacio libre pueden no coincidir exactamente con la salida de pgstattuple, porque el mapa de espacio libre nos da una cifra aproximada, pero no se garantiza que sea exacta al byte.

F.33.2. Autores #

Tatsuo Ishii, Satoshi Nagayasu y Abhijit Menon-Sen