ANALYZE

ANALYZE — recopilar estadísticas sobre una base de datos

Synopsis

ANALYZE [ ( option [, ...] ) ] [ table_and_columns [, ...] ]

donde option puede ser uno de:

    VERBOSE [ boolean ]
    SKIP_LOCKED [ boolean ]
    BUFFER_USAGE_LIMIT size

y table_and_columns es:

    [ ONLY ] table_name [ * ] [ ( column_name [, ...] ) ]

Descripción

ANALYZE recopila estadísticas sobre el contenido de las tablas de la base de datos y almacena los resultados en el catálogo del sistema pg_statistic. Posteriormente, el planificador de consultas utiliza estas estadísticas para ayudar a determinar los planes de ejecución más eficientes para las consultas.

Sin una lista de table_and_columns, ANALYZE procesa cada tabla y vista materializada en la base de datos actual sobre la cual el usuario actual tenga permiso para analizar. Con una lista, ANALYZE procesa solo esa(s) tabla(s). Además, es posible proporcionar una lista de nombres de columnas para una tabla, en cuyo caso solo se recopilan las estadísticas de esas columnas.

Parámetros

VERBOSE

Habilita la visualización de mensajes de progreso en el nivel INFO.

SKIP_LOCKED

Especifica que ANALYZE no debe esperar a que se libere ningún bloqueo conflictivo al comenzar el trabajo en una relación: si una relación no se puede bloquear de inmediato sin esperar, la relación se omite. Ten en cuenta que incluso con esta opción, ANALYZE puede bloquearse al abrir los índices de la relación o al adquirir filas de muestra de particiones, hijos de herencia de tablas y algunos tipos de tablas foráneas. Además, aunque ANALYZE normalmente procesa todas las particiones de las tablas particionadas especificadas, esta opción hará que ANALYZE omita todas las particiones si hay un bloqueo conflictivo en la tabla particionada.

BUFFER_USAGE_LIMIT

Especifica el tamaño del búfer circular de la Estrategia de acceso al búfer (Buffer Access Strategy) para ANALYZE. Este tamaño se usa para calcular el número de búferes compartidos que se reutilizarán como parte de esta estrategia. 0 deshabilita el uso de una Buffer Access Strategy. Cuando no se especifica esta opción, ANALYZE utiliza el valor de vacuum_buffer_usage_limit. Configuraciones más altas pueden permitir que ANALYZE se ejecute más rápidamente, pero tener una configuración demasiado grande puede hacer que se expulsen demasiadas páginas útiles de los búferes compartidos. El valor mínimo es 128 kB y el valor máximo es 16 GB.

boolean

Especifica si la opción seleccionada debe activarse o desactivarse. Puedes escribir TRUE, ON, o 1 para habilitar la opción, y FALSE, OFF, o 0 para deshabilitarla. El valor boolean también puede omitirse, en cuyo caso se asume TRUE.

size

Especifica una cantidad de memoria en kilobytes. Los tamaños también se pueden especificar como una cadena que contiene el tamaño numérico seguido de cualquiera de las siguientes unidades de memoria: B (bytes), kB (kilobytes), MB (megabytes), GB (gigabytes), o TB (terabytes).

table_name

El nombre (opcionalmente calificado por esquema) de una tabla específica a analizar. Si se omite, se analizan todas las tablas regulares, tablas particionadas y vistas materializadas en la base de datos actual (pero no las tablas foráneas). Si se especifica ONLY antes del nombre de la tabla, solo se analiza esa tabla. Si no se especifica ONLY, se analizan la tabla y todas sus tablas hijas de herencia o particiones (si las hay). Opcionalmente, se puede especificar * después del nombre de la tabla para indicar explícitamente que las tablas hijas de herencia (o particiones) deben analizarse.

column_name

El nombre de una columna específica a analizar. Por defecto son todas las columnas.

Salidas

Cuando se especifica VERBOSE, ANALYZE emite mensajes de progreso para indicar qué tabla se está procesando actualmente. También se muestran varias estadísticas sobre las tablas.

Notas

Para analizar una tabla, normalmente se debe tener el privilegio MAINTAIN sobre ella. Sin embargo, los propietarios de bases de datos tienen permitido analizar todas las tablas de sus bases de datos, excepto los catálogos compartidos. ANALYZE omitirá cualquier tabla que el usuario que la llame no tenga permiso para analizar.

Las tablas foráneas se analizan solo cuando se seleccionan explícitamente. No todos los envolvedores de datos externos (foreign data wrappers) admiten ANALYZE. Si el envolvedor de la tabla no admite ANALYZE, el comando imprime una advertencia y no hace nada.

En la configuración predeterminada de PostgreSQL, el demonio autovacuum (consulta Section 24.1.6) se encarga del análisis automático de las tablas cuando se cargan con datos por primera vez y a medida que cambian durante la operación regular. Cuando autovacuum está deshabilitado, es una buena idea ejecutar ANALYZE periódicamente, o justo después de realizar cambios importantes en el contenido de una tabla. Las estadísticas precisas ayudarán al planificador a elegir el plan de consulta más adecuado y, de ese modo, mejorar la velocidad del procesamiento de las consultas. Una estrategia común para las bases de datos de solo lectura es ejecutar VACUUM y ANALYZE una vez al día durante un horario de bajo uso. (Esto no será suficiente si hay una gran actividad de actualización).

Mientras se ejecuta ANALYZE, la ruta de búsqueda (search_path) se cambia temporalmente a pg_catalog, pg_temp.

ANALYZE requiere solo un bloqueo de lectura en la tabla de destino, por lo que puede ejecutarse en paralelo con otra actividad que no sea DDL en la tabla.

Las estadísticas recopiladas por ANALYZE generalmente incluyen una lista de algunos de los valores más comunes en cada columna y un histograma que muestra la distribución aproximada de los datos en cada columna. Uno o ambos se pueden omitir si ANALYZE los considera poco interesantes (por ejemplo, en una columna de clave única, no hay valores comunes) o si el tipo de datos de la columna no admite los operadores adecuados. Hay más información sobre las estadísticas en Chapter 24.

Para tablas grandes, ANALYZE toma una muestra aleatoria del contenido de la tabla, en lugar de examinar cada fila. Esto permite analizar incluso tablas muy grandes en poco tiempo. Ten en cuenta, sin embargo, que las estadísticas son solo aproximadas y cambiarán ligeramente cada vez que se ejecute ANALYZE, incluso si el contenido real de la tabla no cambió. Esto podría resultar en pequeños cambios en los costos estimados del planificador mostrados por EXPLAIN. En situaciones raras, este no determinismo hará que las elecciones de planes de consulta del planificador cambien después de ejecutar ANALYZE. Para evitar esto, aumenta la cantidad de estadísticas recopiladas por ANALYZE, como se describe a continuación.

El alcance del análisis se puede controlar ajustando la variable de configuración default_statistics_target, o columna por columna estableciendo el objetivo de estadísticas por columna con ALTER TABLE ... ALTER COLUMN ... SET STATISTICS. El valor objetivo establece el número máximo de entradas en la lista de valores más comunes y el número máximo de contenedores (bins) en el histograma. El valor objetivo predeterminado es 100, pero se puede ajustar hacia arriba o hacia abajo para equilibrar la precisión de las estimaciones del planificador con el tiempo necesario para ANALYZE y la cantidad de espacio ocupado en pg_statistic. En particular, establecer el objetivo de estadísticas en cero deshabilita la recopilación de estadísticas para esa columna. Podría ser útil hacer esto para columnas que nunca se usan como parte de las cláusulas WHERE, GROUP BY, o ORDER BY de las consultas, ya que el planificador no usará estadísticas sobre tales columnas.

El objetivo de estadísticas más grande entre las columnas analizadas determina el número de filas de la tabla de las que se toma una muestra para preparar las estadísticas. Aumentar el objetivo provoca un aumento proporcional en el tiempo y espacio necesarios para realizar ANALYZE.

Uno de los valores estimados por ANALYZE es el número de valores distintos que aparecen en cada columna. Debido a que solo se examina un subconjunto de las filas, esta estimación a veces puede ser bastante inexacta, incluso con el mayor objetivo de estadísticas posible. Si esta inexactitud conduce a malos planes de consulta, se puede determinar manualmente un valor más preciso y luego instalarlo con ALTER TABLE ... ALTER COLUMN ... SET (n_distinct = ...).

Si la tabla que se está analizando tiene hijos de herencia, ANALYZE recopila dos conjuntos de estadísticas: uno solo sobre las filas de la tabla madre (parent table) y un segundo que incluye las filas tanto de la tabla madre como de todos sus hijos. Este segundo conjunto de estadísticas es necesario al planificar consultas que procesan el árbol de herencia en su totalidad. El demonio autovacuum, sin embargo, solo considerará las inserciones o actualizaciones en la tabla madre en sí al decidir si activa un análisis automático para esa tabla. Si esa tabla rara vez recibe inserciones o actualizaciones, las estadísticas de herencia no estarán actualizadas a menos que ejecutes ANALYZE manualmente. Por defecto, ANALYZE también recopilará y actualizará recursivamente las estadísticas para cada tabla hija de herencia. Se puede usar la palabra clave ONLY para deshabilitar esto.

Para tablas particionadas, ANALYZE recopila estadísticas tomando muestras de filas de todas las particiones. De forma predeterminada, ANALYZE también recopilará y actualizará recursivamente las estadísticas para cada partición. Se puede usar la palabra clave ONLY para deshabilitar esto.

El demonio autovacuum no procesa tablas particionadas, ni procesa padres de herencia si solo se modifican los hijos. Generalmente es necesario ejecutar periódicamente un ANALYZE manual para mantener actualizadas las estadísticas de la jerarquía de tablas.

Si alguna tabla hija o partición son tablas foráneas cuyos envolvedores de datos externos no admiten ANALYZE, esas tablas se ignoran al recopilar estadísticas de herencia.

Si la tabla que se está analizando está completamente vacía, ANALYZE no registrará nuevas estadísticas para esa tabla. Se conservará cualquier estadística existente.

Cada backend que ejecuta ANALYZE informará su progreso en la vista pg_stat_progress_analyze. Consulta Section 27.4.1 para obtener más detalles.

Compatibilidad

No existe la sentencia ANALYZE en el estándar SQL.

La siguiente sintaxis se utilizaba antes de PostgreSQL versión 11 y todavía se admite:

ANALYZE [ VERBOSE ] [ table_and_columns [, ...] ]

Véase también

VACUUM, vacuumdb, Section 19.10.2, Section 24.1.6, Section 27.4.1