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.
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
| Columna | Tipo | Descripción |
|---|---|---|
table_len | bigint | Longitud física de la relación en bytes |
tuple_count | bigint | Número de tuplas vivas (live tuples) |
tuple_len | bigint | Longitud total de las tuplas vivas en bytes |
tuple_percent | float8 | Porcentaje de tuplas vivas |
dead_tuple_count | bigint | Número de tuplas muertas |
dead_tuple_len | bigint | Longitud total de las tuplas muertas en bytes |
dead_tuple_percent | float8 | Porcentaje de tuplas muertas |
free_space | bigint | Espacio libre total en bytes |
free_percent | float8 | Porcentaje de espacio libre |
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:
| Columna | Tipo | Descripción |
|---|---|---|
version | integer | Número de versión de B-tree |
tree_level | integer | Nivel de árbol de la página raíz (root page) |
index_size | bigint | Tamaño total del índice en bytes |
root_block_no | bigint | Ubicación de la página raíz (cero si no hay) |
internal_pages | bigint | Número de páginas “internas” (nivel superior) |
leaf_pages | bigint | Número de páginas hoja (leaf pages) |
empty_pages | bigint | Número de páginas vacías |
deleted_pages | bigint | Número de páginas eliminadas |
avg_leaf_density | float8 | Densidad media de las páginas hoja |
leaf_fragmentation | float8 | Fragmentació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:
| Columna | Tipo | Descripción |
|---|---|---|
version | integer | Número de versión de GIN |
pending_pages | integer | Número de páginas en la lista de pendientes (pending list) |
pending_tuples | bigint | Nú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:
| Columna | Tipo | Descripción |
|---|---|---|
version | integer | Número de versión de HASH |
bucket_pages | bigint | Número de páginas de cubo (bucket pages) |
overflow_pages | bigint | Número de páginas de desbordamiento (overflow pages) |
bitmap_pages | bigint | Número de páginas de mapa de bits |
unused_pages | bigint | Número de páginas no utilizadas |
live_items | bigint | Número de tuplas vivas |
dead_tuples | bigint | Número de tuplas muertas |
free_percent | float | Porcentaje 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
| Columna | Tipo | Descripción |
|---|---|---|
table_len | bigint | Longitud física de la relación en bytes (exacta) |
scanned_percent | float8 | Porcentaje de tabla escaneada |
approx_tuple_count | bigint | Número de tuplas vivas (estimado) |
approx_tuple_len | bigint | Longitud total de las tuplas vivas en bytes (estimada) |
approx_tuple_percent | float8 | Porcentaje de tuplas vivas |
dead_tuple_count | bigint | Número de tuplas muertas (exacto) |
dead_tuple_len | bigint | Longitud total de las tuplas muertas en bytes (exacto) |
dead_tuple_percent | float8 | Porcentaje de tuplas muertas |
approx_free_space | bigint | Espacio libre total en bytes (estimado) |
approx_free_percent | float8 | Porcentaje 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.
Tatsuo Ishii, Satoshi Nagayasu y Abhijit Menon-Sen