Relación de la clave principal y el índice agrupado

92

¿Puede TABLEtener una clave principal sin un índice agrupado?

¿Y puede TABLEtener un índice agrupado sin tener una clave principal?

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

F11
fuente

Respuestas:

102

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.

Neville Kuyt
fuente
1
Hola. El tema es antiguo, pero tal vez alguien pueda responder a mi pregunta. Si la columna se declara como ÍNDICE CLÚSTER ÚNICO NO NULO, ¿hacerla CLAVE PRIMARIA hará algún cambio real en el rendimiento o algo?
jesse
Esa es una pregunta interesante. Asumiría que no, ya que tiene que realizar todas las mismas comprobaciones de cualquier manera.
Jonathan Allen
Brillante respuesta.
NikosV
Pero sobre todo, una columna de clave principal con un índice agrupado será útil ya que simplifica mucho la búsqueda de rango.
hunter_tech
34

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 nonclusteredopción.

Un ejemplo, donde t1tiene una clave principal t2no 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);

Ejemplo en SQL Fiddle.

Andomar
fuente
19

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.

Branko Dimitrijevic
fuente
4

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.

Sepster
fuente
En SQL Server, la clave principal se agrupará de forma predeterminada, a menos que le indique explícitamente que no lo esté. Pero eso es solo un valor predeterminado, no un requisito.
marc_s
¿Puede una tabla tener una clave principal sin ningún índice? Porque, cuando digo que una columna es la clave principal, por defecto se crea un índice agrupado. Cuando se elimina el índice, ¿la tabla ya no contiene la clave principal?
veljasije
1

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.

robotj
fuente
Este es más un comentario debajo de la respuesta marcada como la correcta.
Jan Doggen
1
Bienvenido. Te doy un +1 porque veo que aún no tienes la reputación de agregar comentarios. (Estuve allí, hice eso :)
Ingeniero
0

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.

himanshupareek66
fuente