CLUSTER

Nombre

CLUSTER  --  Proporciona aviso de almacenaje agrupado (clustering) al servidor.

Synopsis

CLUSTER indexname ON table
  

Entradas

Nombre del indice

El nombre de un indice.

table

El nombre de una tabla.

Salidas

CLUSTER

El agrupamiento se hizo exitosamente.

ERROR: relation <tablerelation_number> inherits "table"

RATIONALE:

Esto no esta documentado en ningun lugar. Parece que no es posible agrupar una tabla que es heredada.

ERROR: Relation table does not exist!

RATIONALE:

La relacion especificada no fue mostrada en el mensaje de error, la cual contiene una cadena aleatoria en lugar del nombre de una relación.

Descripccion

CLUSTER manda a Postgres que agrupe la clase especificada por table basandose aproximadamente en el indice especificado por indexname. El indice debe haber sido definido ya en classname.

Cunado una clase se agrupa, es fisicamente reordenada basandose en la informacion del indice. El agrupamiento es estatico. En otras palabras, mientras que la clase es actualizada, los cambios no son agrupados. No se hace ningun intento de mantener agrupadas nuevas instancias o tuplas actualizadas. Si uno quiere, puede reagruparlas manualmente ejecutando el comando de nuevo.

Notas

La tabla actualmente esta copiada a una tabla temporal con el orden del indice, despues se renombra a su nombre original. Por esta razon, todos los premisos concedidos y otros indices se pierden cuando se ejecuta el agrupamiento (clustering).

En los casos en que accedes a una lineas solas aleatoreamente dentro de una tlaba, el orden actual de los datos en el global de la tabla no es importante. Sin embargo, si tienes tendencia a acceder a algunos datos mas que a otros, y hay un indice que los agrupa, te beneficiaras del uso de CLUSTER.

Otro lugar en el que CLUSTER es de ayuda es en los casos en los que utilizas un indice para extraer muchas lineas de una tabla, o un unico valor de un indice tiene multiples lineas con las que coincide, CLUSTER ayudara porque una vez el indice identifica el total de paginas (de disco) para la primera linea con la que coincide, todas las otras lineas que coinciden probablemente esten ya en la misma pagina del total, ahorrando accesos a disco y acelerando la consulta.

Hay dos maneras para agrupar datos. La primera es con el comando CLUSTER, que reordena la tabla original con la ordenacion del indice que especifiques. Esta puede ser lenta en tablas grandes porque las lineas se van a buscar desde el global de la tabla en orden de indice, y si el global de la tabla esta desordenada, las entradas estan en paginas aleatorias, de este modo hay una pagina de disco recuperada por cada linea movida. Postgres tiene una cache, pero la mayoria de una tabla grande no cabra en la cache.

Otra manera para agrupar datos es utilizar

SELECT columnlist INTO TABLE newtable
     FROM table ORDER BY columnlist
    
que utliza el codigo de ordenacion de Postgres en la clausula ORDER BY para hacer coincidir los indices, y que es mucho mas rapido para datos desordenados. Despues borra la tabla vieja, utiliza ALTER TABLE/RENAME para renombrar como temp la tabla vieja, y recrear cualquier indice. El unico problema es que no se conservar los OID. De ahi en adelante, CLUSTER deberia ser rapido porque la mayoria de los datos ya han sido ordenados, y se utiliza el indice existente.

NotaNota de traductor
 

Un índice agrupado es aquel que llegado al final de su árbol b-tree no contiene un puntero a una página de disco en la que está la tupla, sino la propia tupla.

Utilizacion

Agrupamiento de la relacion empleados basandose en su atributo salario

CLUSTER emp_ind ON emp;
  

Compatibilidad

SQL92

No hay ningun estatuto de lenguaje CLUSTER en SQL92.