¿Puede TABLE
tener una clave principal sin un índice agrupado?
¿Y puede TABLE
tener un índice agrupado sin tener una clave principal?
¿Alguien puede decirme brevemente la relación entre la clave principal y el índice agrupado?
Respuestas:
Una clave principal es un concepto lógico : 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 con frecuencia, sería bueno tener un índice de la clave principal.
Un índice agrupado es un concepto físico : es un índice que afecta el orden en 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 (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 en el nivel de hoja. Eso significa que un índice agrupado contiene todos los datos de la tabla. Una tabla sin un índice agrupado se llama montón.
Una clave principal es un índice único 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 la nonclustered
opción.
Un ejemplo, donde t1
tiene una clave principal t2
no agrupada y no está agrupada, 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);
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 TABLE 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 agrupación que sea 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úster no único (usando CREATE CLUSTERED INDEX ...
), MS SQL Server lo hará automáticamente único 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 sus aplicaciones cliente (como cuando se confía demasiado en la columna oculta mencionada anteriormente, o cuando se agrupa en una clave sustituta ), está prácticamente 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 de forma predeterminada . Puede cambiar ese valor predeterminado, como se discutió anteriormente.
Respuestas tomadas de MSDN con índices agrupados
¿Puede una TABLA tener una clave principal sin un índice agrupado? - Si.
¿Puede una TABLA tener índice agrupado sin clave principal? - Si.
Una clave principal es una restricción que garantiza la unicidad de los valores, de modo que una fila siempre se puede identificar específicamente por esa clave.
Un índice se asigna automáticamente a una clave principal (ya que las filas a menudo se "buscan" por su clave principal).
Un índice no agrupado es un orden lógico de filas, por una (o más) de sus columnas. Considérelo como otra "copia" de la tabla, ordenada por las columnas en las que se encuentre el índice.
Un índice agrupado es cuando la tabla real está ordenada físicamente por una columna en particular. Una tabla no siempre tendrá un índice agrupado (es decir, aunque estará físicamente ordenada por algo , esa cosa podría no estar definida ). Una tabla no puede tener más de un índice agrupado, aunque puede tener un único índice agrupado compuesto (es decir, la tabla está ordenada físicamente por, por ejemplo, Apellido, Nombre, Fecha de nacimiento).
El PK es a menudo (pero no siempre) un índice agrupado.
Por lo que pueda valer, en MS SQL Server todas las columnas de la clave principal deben definirse como NO nulas, mientras que la creación de un índice agrupado único no requiere esto. Sin embargo, no estoy seguro de otros sistemas de base de datos.
Puede que no se relacione como la respuesta a esta pregunta, pero algunos aspectos importantes sobre la clave principal y los índices agrupados son ->
Si hay una clave principal (por defecto, que es un índice agrupado, sin embargo, podemos cambiar eso) con el índice agrupado, entonces no podemos crear un índice agrupado más para esa tabla. Pero si aún no hay un conjunto de claves principales y hay un índice agrupado, no podemos crear una clave principal con el índice agrupado.