CLUSTER — agrupar (clusterizar) una tabla según un índice
CLUSTER [ (option[, ...] ) ] [table_name[ USINGindex_name] ] dondeoptionpuede ser uno de: VERBOSE [boolean]
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
vuelve a agrupar la tabla usando el mismo índice que antes. También puedes
usar las formas table_nameCLUSTER 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.
table_nameEl nombre (opcionalmente calificado por esquema) de una tabla.
index_nameEl 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.
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.
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;
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[ USINGindex_name] ]
La siguiente sintaxis se utilizaba antes de PostgreSQL 8.3 y todavía es compatible:
CLUSTERindex_nameONtable_name