2011-01-25 12 views
23

Estoy usando psql para acceder a una base de datos postgres. Al ver los metadatos de una tabla, ¿hay alguna manera de ver si un índice de una tabla es un índice agrupado?Acerca del índice agrupado en postgres

Escuché que la PRIMARY KEY de una tabla se asocia automáticamente con un índice agrupado, ¿es cierto?

+2

PostgreSQL no tiene un índice agrupado, pero ¿por qué crees que sería interesante? ¿Tienes un problema para resolver? –

+7

Ningún problema en particular para resolver. Acabo de aprender sobre postgre :-) – zzhang

+0

Me habría preguntado por qué mis tablas no desfragmentarán automáticamente si no fuera por esta pregunta –

Respuesta

12

¿Hay alguna manera para ver si un índice de una tabla es un índice agrupado

PostgreSQL no tiene un índice agrupado, por lo que no será capaz de verlos.

Escuché que la PRIMARY KEY de una tabla se asocia automáticamente con un índice agrupado, ¿es cierto?

No, eso no es verdad (véase más arriba)

Puede agrupar manualmente una mesa a lo largo de un índice, pero esto no es nada que se mantendrá de forma automática (como por ejemplo, con los índices agrupados de SQL Server).

Para obtener más información, consulte la descripción del comando CLUSTER en el manual.

+0

Entonces, ¿puedo usar \ d para saber si una tabla está agrupada a lo largo de un índice? – zzhang

+0

'\ dS +' debería hacer eso si leo el manual correctamente. Solo mira la ayuda y juega con los optioins. –

25

Tenga en cuenta que PostgreSQL usa el término "índice agrupado" para usar algo vagamente similar pero muy diferente de SQL Server.

Si un índice en particular ha sido nominado como el índice de agrupación para una tabla, a continuación, la orden de psql \d indicará el índice agrupado, por ejemplo,

Indexes: 
    "timezone_description_pkey" PRIMARY KEY, btree (timezone) CLUSTER 

PostgreSQL no postula índices como índices de agrupación por defecto. Tampoco organiza automáticamente los datos de la tabla para que se correlacionen con el índice agrupado, incluso cuando están nominados: el comando CLUSTER debe ser utilizado para reorganizar los datos de la tabla.

15

En PostgreSQL, el atributo agrupado se mantiene en los metadatos del índice correspondiente, en lugar de la relación en sí misma. Es el atributo indisclustered en el catálogo pg_index. Tenga en cuenta, sin embargo, que las relaciones de agrupamiento dentro de postgres es una acción de una sola vez: incluso si el atributo es verdadero, las actualizaciones de la tabla no mantienen la naturaleza ordenada de los datos. Hasta la fecha, el mantenimiento automático de la agrupación de datos sigue siendo un elemento popular TODO.

A menudo hay confusión entre agrupados y integrados índices, sobre todo porque los libros de texto populares usan nombres en conflicto, y la terminología es diferente otra vez en los manuales de Postgres y el servidor SQL (por nombrar sólo dos). Cuando hablo de un índice integrado (también llamado un índice principal o índice primario) quiero decir uno en el que los datos de relación está contenida en las hojas de índice, en contraposición una externa o secundaria índice en el que las hojas contienen entradas de índice que apuntan a los registros de la tabla. El primer tipo necesariamente siempre está agrupado. Lamentablemente, postgres solo es compatible con este último tipo.De todos modos, el hecho de que un índice integrado (primario) siempre esté agrupado puede haber dado lugar a la creencia de que "una CLAVE PRIMARIA de una tabla se asocia automáticamente con un índice agrupado". Las dos declaraciones suenan similares, pero son diferentes.

+1

Creo que SQL Server también hace que las claves primarias usen un índice agrupado de forma predeterminada a menos que diga lo contrario, ¿no? Eso puede llevar a la confusión o conducir a la suposición de que los dos necesariamente significan lo mismo. – Brandon

+1

Sí, de acuerdo con http://msdn.microsoft.com/en-us/library/ms174979.aspx "Restricciones de PRIMARY KEY predeterminadas a CLUSTERED, y restricciones ÚNICAS predeterminadas a NONCLUSTERED". – beldaz

2

PostgreSQL no tiene implementación directa del índice CLUSTER como Microsoft SQL Server.

Reference Taken from this Blog:

En PostgreSQL, tenemos una de comandos de grupo que es similar al cluster Índice.

Una vez que crea su clave principal de tabla o cualquier otro índice, puede ejecutar el comando CLUSTER especificando ese nombre de índice para lograr el orden físico de los datos de tabla.

Cuando una tabla está agrupada, se reordena físicamente según la información del índice. La agrupación en clúster es una operación de una sola vez: cuando la tabla se actualiza posteriormente, los cambios no se agrupan. Es decir, no se intenta almacenar filas nuevas o actualizadas de acuerdo con su orden de índice.

Sintaxis del Cluster:

primera vez, debe ejecutar clúster mediante el nombre del índice.

CLUSTER table_name USING index_name; 

Cluster de la mesa:

Una vez que se ha ejecutado con CLUSTER Índice, la próxima vez que se ejecute solamente Cuadro clúster, porque sabe que el que ya se define como índice de clúster.

CLUSTER table_name; 
1

Si desea saber si una tabla dada es CLUSTER ed utilizando SQL, puede utilizar la siguiente consulta para mostrar el índice utilizado (probado en las versiones de Postgres 9.5 y 9.6):

SELECT 
    i.relname AS index_for_cluster 
FROM 
    pg_index AS idx 
JOIN 
    pg_class AS i 
ON 
    i.oid = idx.indexrelid 
WHERE 
    idx.indisclustered 
    AND idx.indrelid::regclass = 'your_table_name'::regclass; 
+0

la instrucción sql que proporcionó no funcionó –

+0

@ DanielL.VanDenBosch, ¿cuál fue el error? Acabo de verificar que funciona para mí (y aclaré la versión de postgres en mi respuesta). – seb

Cuestiones relacionadas