Solución:
Una clave primaria es una lógico concepto: es el identificador único de una fila en una tabla. Como tal, tiene muchos atributos; puede que no sea nulo y debe ser único. Por supuesto, como es probable que busque registros por su identificador único, sería bueno tener un índice en la clave principal.
Un índice agrupado es un físico concepto: es un índice que afecta el orden en el que se almacenan los registros en el disco. Esto lo convierte en un índice muy rápido al acceder a los datos, aunque puede ralentizar las escrituras si su clave principal no es un número secuencial.
Sí, puede tener una clave principal sin un índice agrupado y, a veces, es posible que desee hacerlo (por ejemplo, cuando su clave principal es una combinación de claves externas en una tabla de unión y no desea incurrir en la sobrecarga de reproducción aleatoria del disco cuando se escribe).
Sí, puede crear un índice agrupado en columnas que no son una clave principal.
Una tabla puede tener una clave principal que no esté agrupada y una tabla agrupada no requiere una clave principal. Entonces, la respuesta a ambas preguntas es sí.
Un índice agrupado almacena todas las columnas a nivel de hoja. Eso significa que un índice agrupado contiene todos los datos de la tabla. Una tabla sin un índice agrupado se denomina montón.
Una clave principal es un índice único que está agrupado de forma predeterminada. De forma predeterminada, significa que cuando crea una clave principal, si la tabla aún no está agrupada, la clave principal se creará como un índice único agrupado. A menos que especifique explícitamente el nonclustered
opción.
Un ejemplo, donde t1
tiene una clave principal no agrupada, y t2
no está agrupado pero tiene una clave principal:
create table t1 (id int not null, col1 int);
alter table t1 add constraint PK_T1 primary key nonclustered (id);
create clustered 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 nonclustered (id);
Ejemplo en SQL Fiddle.
En primer lugar, eche un vistazo a las tablas organizadas por índices y los índices agrupados. De hecho, recomiendo leer el completo Use the Index Luke! sitio desde el principio hasta llegar al tema de la agrupación en clústeres para comprender realmente lo que está sucediendo.
Ahora, a tus preguntas …
¿Puede una TABLA tener una clave principal sin un índice agrupado?
Sí, use la palabra clave NO CLASIFICADA al declarar su clave 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 parecen simplemente aceptar el valor predeterminado (que está CLÚSTER), aunque en muchos casos una tabla basada en montón sería mejor (como se explica en el artículo vinculado).
y ¿Puede una TABLA tener un índice agrupado sin clave principal?
A diferencia de otros DBMS, MS SQL Server le permitirá tener un índice de agrupamiento que es diferente de la clave principal, o incluso sin tener la clave principal en absoluto.
El siguiente ejemplo crea un índice de agrupación en clústeres separado del PK, que tiene una restricción ÚNICA encima, que es lo que probablemente desearía 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 agrupación en clústeres no exclusivo (utilizando CREATE CLUSTERED INDEX ...
), MS SQL Server lo hará único automáticamente al agregarle un campo oculto.
Tenga en cuenta que los beneficios de la agrupación en clústeres son más visibles para los escaneos de rango. Si usa un índice de agrupamiento que no se “alinea” con los escaneos de rango realizados por su (s) aplicación (es) cliente (como cuando se confía demasiado en la columna oculta mencionada anteriormente, o cuando se agrupa en una clave sustituta), está más o menos derrotando el propósito de la agrupación.
¿Alguien puede decirme brevemente la relación entre la clave principal y el índice agrupado?
En MS SQL Server, la clave principal también está agrupada por defecto. Puede cambiar ese valor predeterminado, como se discutió anteriormente.