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.
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 columnlistque 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.
Nota 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.