Te sugerimos que pruebes esta respuesta en un ambiente controlado antes de enviarlo a producción, saludos.
Solución:
Un primario key es un lógico concepto: es el identificador único de una fila en una tabla. Como tal, tiene un montón de attributes – puede que no sea null, y debe ser único. Por supuesto, como es probable que busque mucho los registros por su identificador único, sería bueno tener un índice en el principal key.
Un índice agrupado es un físico concepto: 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 principal key no es un número secuencial.
Sí, puedes tener una primaria. key sin un índice agrupado y, a veces, es posible que desee hacerlo (por ejemplo, cuando su principal key es una combinación de extranjero keys en una mesa de unión, y no desea incurrir en la sobrecarga de reproducción aleatoria del disco al escribir).
Sí, puede crear un índice agrupado en columnas que no son primarias key.
Una tabla puede tener un primario key que no está agrupada, y una tabla agrupada no requiere un primario key. Así que 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 denomina montón.
Un primario key es un índice único que está agrupado de forma predeterminada. Por defecto significa que cuando creas un primario keysi la tabla aún no está agrupada, el principal key se creará como un índice único agrupado. A menos que especifique explícitamente el nonclustered
opción.
Un ejemplo, donde t1
tiene un primario no agrupado keyy t2
no está agrupado pero tiene un primario key:
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 todo el libro Use the Index Luke! sitio desde el principio hasta que llegue al tema de agrupación para entender realmente lo que está pasando.
Ahora, a tus preguntas…
¿Puede una TABLA tener primaria key sin índice agrupado?
Sí, use la palabra clave NONCLUSTERED al declarar su principal key para hacer una tabla basada en montón. Por ejemplo:
CREATE TABLE YOUR_TABLE (
YOUR_PK int PRIMARY KEY NONCLUSTERED
-- Other fields...
);
Esto es desafortunado, ya que mucha gente parece aceptar el valor predeterminado (que es CLUSTERED), aunque en muchos casos una tabla basada en montones sería mejor (como se explica en el artículo vinculado).
y ¿Puede una TABLA tener un índice agrupado sin primario? key?
A diferencia de otros DBMS, MS SQL Server le permitirá tener un índice de agrupación que es diferente del principal. keyo incluso sin tener el primario key en absoluto.
El siguiente ejemplo crea un índice de agrupamiento 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 agrupamiento no único (usando 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 utiliza 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 un sustituto key), prácticamente está frustrando el propósito de la agrupación.
¿Alguien puede decirme brevemente la relación de primaria key y el índice agrupado?
En MS SQL Server, principal key también está agrupado por defecto. Puede cambiar ese valor predeterminado, como se mencionó anteriormente.
Si te apasiona la programación, tienes la opción de dejar una reseña acerca de qué te ha gustado de este escrito.