ANALYZE — recopilar estadísticas sobre una base de datos
ANALYZE [ (option[, ...] ) ] [table_and_columns[, ...] ] dondeoptionpuede ser uno de: VERBOSE [boolean] SKIP_LOCKED [boolean] BUFFER_USAGE_LIMITsizeytable_and_columnses: [ ONLY ]table_name[ * ] [ (column_name[, ...] ) ]
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.
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_nameEl nombre de una columna específica a analizar. Por defecto son todas las columnas.
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.
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.
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 [, ...] ]