CLUSTER

CLUSTER — agrupar (clusterizar) una tabla según un índice

Synopsis

CLUSTER [ ( option [, ...] ) ] [ table_name [ USING index_name ] ]

donde option puede ser uno de:

    VERBOSE [ boolean ]

Descripción

CLUSTER le indica a PostgreSQL que agrupe la tabla especificada por table_name basándose en el índice especificado por index_name. El índice debe haber sido definido previamente en table_name.

Cuando se agrupa una tabla, esta se reordena físicamente según la información del índice. La agrupación (clustering) es una operación de una sola vez: cuando la tabla se actualiza posteriormente, los cambios no se agrupan. Es decir, no se realiza ningún intento de almacenar las filas nuevas o actualizadas de acuerdo con el orden de su índice. (Si lo deseas, puedes volver a agrupar periódicamente ejecutando el comando de nuevo. Además, establecer el parámetro de almacenamiento fillfactor de la tabla a menos del 100% puede ayudar a preservar el orden de agrupación durante las actualizaciones, ya que las filas actualizadas se mantienen en la misma página si hay suficiente espacio disponible allí).

Cuando una tabla se agrupa, PostgreSQL recuerda con qué índice se agrupó. La forma CLUSTER table_name vuelve a agrupar la tabla usando el mismo índice que antes. También puedes usar las formas CLUSTER o SET WITHOUT CLUSTER de ALTER TABLE para establecer el índice que se utilizará para futuras operaciones de agrupación, o para borrar cualquier configuración previa.

CLUSTER sin un table_name vuelve a agrupar todas las tablas previamente agrupadas en la base de datos actual para las cuales el usuario que realiza la llamada tiene privilegios. Esta forma de CLUSTER no se puede ejecutar dentro de un bloque de transacción.

Cuando se está agrupando una tabla, se adquiere un bloqueo ACCESS EXCLUSIVE sobre ella. Esto evita que cualquier otra operación de base de datos (tanto de lectura como de escritura) opere sobre la tabla hasta que CLUSTER termine.

Parámetros

table_name

El nombre (opcionalmente calificado por esquema) de una tabla.

index_name

El nombre de un índice.

VERBOSE

Muestra un informe de progreso a nivel de INFO a medida que se agrupa cada tabla.

boolean

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

Notas

Para agrupar una tabla, se debe tener el privilegio MAINTAIN sobre la tabla.

En los casos en los que accedes a filas individuales de forma aleatoria dentro de una tabla, el orden real de los datos en la tabla no es importante. Sin embargo, si tiendes a acceder a algunos datos más que a otros, y hay un índice que los agrupa, te beneficiarás del uso de CLUSTER. Si estás solicitando un rango de valores indexados de una tabla, o un único valor indexado que tiene múltiples filas que coinciden, CLUSTER te ayudará porque una vez que el índice identifica la página de la tabla para la primera fila que coincide, todas las demás filas que coinciden probablemente ya estén en la misma página de la tabla, por lo que ahorras accesos a disco y aceleras la consulta.

CLUSTER puede volver a ordenar la tabla utilizando un escaneo de índice en el índice especificado, o (si el índice es un b-tree) un escaneo secuencial seguido de un ordenamiento. Intentará elegir el método que sea más rápido, según los parámetros de costo del planificador y la información estadística disponible.

Mientras se ejecuta CLUSTER, el search_path se cambia temporalmente a pg_catalog, pg_temp.

Cuando se utiliza un escaneo de índice, se crea una copia temporal de la tabla que contiene los datos de la tabla en el orden del índice. También se crean copias temporales de cada índice en la tabla. Por lo tanto, necesitas espacio libre en disco que sea al menos igual a la suma del tamaño de la tabla y los tamaños de los índices.

Cuando se utiliza un escaneo secuencial y ordenamiento, también se crea un archivo de ordenamiento temporal, de modo que el requisito de espacio temporal máximo es de hasta el doble del tamaño de la tabla, más los tamaños de los índices. Este método suele ser más rápido que el método de escaneo de índice, pero si el requisito de espacio en disco es inaceptable, puedes desactivar esta opción configurando temporalmente enable_sort a off.

Se aconseja establecer maintenance_work_mem a un valor razonablemente grande (pero no más que la cantidad de RAM que puedas dedicar a la operación CLUSTER) antes de agrupar.

Debido a que el planificador registra estadísticas sobre el orden de las tablas, se aconseja ejecutar ANALYZE en la tabla recién agrupada. De lo contrario, el planificador podría elegir planes de consulta deficientes.

Dado que CLUSTER recuerda qué índices están agrupados, uno puede agrupar las tablas que desee manualmente la primera vez, y luego configurar un script de mantenimiento periódico que ejecute CLUSTER sin ningún parámetro, para que las tablas deseadas se vuelvan a agrupar periódicamente.

Cada proceso de respaldo (backend) que ejecute CLUSTER informará de su progreso en la vista pg_stat_progress_cluster. Consulta Section 27.4.2 para obtener más detalles.

Agrupar una tabla particionada agrupa cada una de sus particiones utilizando la partición del índice particionado especificado. Al agrupar una tabla particionada, el índice no se puede omitir. CLUSTER en una tabla particionada no se puede ejecutar dentro de un bloque de transacción.

Ejemplos

Agrupar la tabla employees sobre la base de su índice employees_ind:

CLUSTER employees USING employees_ind;

Agrupar la tabla employees usando el mismo índice que se usó antes:

CLUSTER employees;

Agrupar todas las tablas de la base de datos que se hayan agrupado previamente:

CLUSTER;

Compatibilidad

No existe una instrucción CLUSTER en el estándar SQL.

La siguiente sintaxis se utilizaba antes de PostgreSQL 17 y todavía es compatible:

CLUSTER [ VERBOSE ] [ table_name [ USING index_name ] ]

La siguiente sintaxis se utilizaba antes de PostgreSQL 8.3 y todavía es compatible:

CLUSTER index_name ON table_name

Consulte también

clusterdb, Section 27.4.2