Relación de key principal e índice agrupado

¿Puede una TABLA tener key principal sin índice agrupado?

y ¿Puede una TABLA tener un índice agrupado sin key principal?

¿Alguien puede decirme brevemente la relación entre la key principal y el índice agrupado?

Una key principal es un concepto lógico : es el identificador único de una fila en una tabla. Como tal, tiene un set de attributes: puede no ser nulo y debe ser único. Por supuesto, como es probable que esté buscando loggings por su identificador único mucho, sería bueno tener un índice en la key principal.

Un índice agrupado es un concepto físico : es un índice que afecta el order en que los loggings se almacenan en el disco. Esto hace que sea un índice muy rápido al acceder a los datos, aunque puede ralentizar las escrituras si su key principal no es un número secuencial.

Sí, puede tener una key principal sin un índice agrupado, y en ocasiones, es posible que desee (por ejemplo, cuando su key principal es una combinación de keys externas en una tabla de unión, y no desea incurrir en la sobrecarga aleatoria del disco) cuando se escribe).

Sí, puede crear un índice agrupado en columnas que no sean una key principal.

Una tabla puede tener una key principal que no está agrupada, y una tabla agrupada no requiere una key principal. Entonces, la respuesta a ambas preguntas es sí.

Un índice agrupado almacena todas las columnas en el nivel de la hoja. Eso significa que un índice agrupado contiene todos los datos en la tabla. Una tabla sin un índice agrupado se denomina montón.

Una key principal es un índice único que está agrupado por defecto. De forma pnetworkingeterminada, significa que cuando crea una key principal, si la tabla aún no está agrupada, la key principal se creará como un índice único agrupado. A less que especifiques explícitamente la opción nonclustenetworking .

Un ejemplo, donde t1 tiene una key primaria no agrupada, y t2 no está agrupada pero tiene una key principal:

 create table t1 (id int not null, col1 int); alter table t1 add constraint PK_T1 primary key nonclustenetworking (id); create clustenetworking index IX_T1_COL1 on t1 (col1); create table t2 (id int not null, col1 int); alter table t2 add constraint PK_T2 primary key nonclustenetworking (id); 

Ejemplo en SQL Fiddle.

En primer lugar, eche un vistazo a las tablas organizadas por índices y a los índices agrupados . En realidad, recomiendo leer todo el contenido. ¡ Usa el índice Luke! desde el principio hasta que llegue al tema de la agrupación para comprender realmente lo que está sucediendo.

Ahora, a tus preguntas …


¿Puede una TABLA tener key principal sin índice agrupado?

Sí, use la palabra key NONCLUSTERED al declarar su key principal para crear una tabla basada en el montón. Por ejemplo:

 CREATE TABLE YOUR_TABLE ( YOUR_PK int PRIMARY KEY NONCLUSTERED -- Other fields... ); 

Esto es desafortunado, ya que muchas personas simplemente aceptan el valor pnetworkingeterminado (que está CLUSTERED), aunque en muchos casos una tabla basada en el montón sería en realidad mejor (como se explica en el artículo vinculado).


y ¿Puede una TABLA tener un índice agrupado sin key principal?

A diferencia de algunos otros DBMS, MS SQL Server le permitirá tener un índice de clúster que es diferente de la key principal, o incluso sin tener la key principal en absoluto.

El siguiente ejemplo crea un índice de agrupación separado del PK, que tiene una restricción ÚNICA encima, que es lo que probablemente desee en la mayoría de los casos:

 CREATE TABLE YOUR_TABLE ( YOUR_PK int PRIMARY KEY, YOUR_CLUSTERED_KEY int NOT NULL UNIQUE CLUSTERED -- Other fields... ); 

Si elige un índice de clúster no único (utilizando CREATE CLUSTERED INDEX ... ), MS SQL Server automáticamente lo hará único al agregarle un campo oculto.

Tenga en count que los beneficios de la agrupación son más visibles para escaneos de range. Si utiliza un índice de clúster que no se "alinea" con los escaneos realizados por su (s) aplicación (es) cliente (como cuando confía demasiado en la columna oculta mencionada anteriormente, o agrupando en una key sustituta ), usted es más o less derrotando el propósito de la agrupación.


¿Alguien puede decirme brevemente la relación entre la key principal y el índice agrupado?

En MS SQL Server, la key principal también se agrupa de forma pnetworkingeterminada . Puede cambiar ese valor pnetworkingeterminado, como se discutió anteriormente.

Respuestas tomadas de MSDN con índices agrupados

¿Puede una TABLA tener key principal sin índice agrupado? – Sí.

¿Puede una TABLE tener índice agrupado sin key principal? – Sí.

Una key principal es una restricción que asegura la exclusividad de los valores, de modo que una fila siempre se puede identificar específicamente mediante esa key.

Un índice se asigna automáticamente a una key principal (ya que las filas a menudo son "buscadas" por su key principal).

Un índice no agrupado es un orderamiento lógico de filas, por una (o más) de sus columnas. Piense en ello como otra "copy" de la tabla, orderada por las columnas en las que se encuentre el índice.

Un índice agrupado es cuando la tabla real está físicamente orderada por una columna en particular. Una tabla no siempre tendrá un índice agrupado (es decir, mientras esté físicamente orderado por algo , esa cosa podría estar indefinida ). Una tabla no puede tener más de un índice agrupado, aunque puede tener un solo índice agrupado compuesto (es decir, la tabla está físicamente orderada por, por ejemplo, Apellido, Nombre, Fecha de nacimiento).

El PK es a menudo (pero no siempre) un índice agrupado.

Puede que no se relacione como respuesta a esta pregunta, pero algunos aspectos importantes de la key principal y los índices agrupados son ->

Si hay una key principal (por defecto, que es el índice agrupado, sin embargo, podemos cambiar eso) con índice agrupado, entonces no podemos crear un índice agrupado más para esa tabla. Pero si todavía no se ha establecido una key principal y hay un índice agrupado, no podemos crear una key principal con índice agrupado.

Por lo que pueda valer, en MS SQL Server todas las columnas en la key primaria deben definirse como NOT Null, mientras que la creación de índices agrupados únicos no requiere esto. Sin embargo, no estoy seguro acerca de otros sistemas de bases de datos.