¿Existe un equivalente de SQL Server 2008 de la cláusula USING INDEX en Oracle? Específicamente para la construcción:
CREATE TABLE c(c1 INT, c2 INT);
CREATE INDEX ci ON c (c1, c2);
ALTER TABLE c ADD CONSTRAINT cpk PRIMARY KEY (c1) USING INDEX ci;
En la Documentación del servidor SQL sobre índices únicos, se indica (énfasis agregado):
Los índices únicos se implementan de las siguientes maneras:
CLAVE PRIMARIA o restricción ÚNICA
Cuando crea una restricción PRIMARY KEY, un índice agrupado único en la columna o columnas se crea automáticamente si un índice agrupado en la tabla aún no existe y no especifica un índice no agrupado único . La columna de clave principal no puede permitir valores NULL.
Lo que parece implicar que hay una manera de especificar qué índice debe usarse para una Clave primaria.
create table c (c1 int not null primary key, c2 int)
Respuestas:
No. Cuando crea una clave primaria o una restricción única en SQL Server, se crea automáticamente un índice único para admitir esa restricción, con las mismas claves.
No. La documentación solo intenta explicar si el índice de soporte automático se creará como agrupado o no agrupado, si no lo especifica. Está redactado de manera confusa, estoy de acuerdo.
Para aclarar, cuando agrega una restricción de clave principal a una tabla existente sin expresar una preferencia, el índice de soporte se agrupará si no hay un índice agrupado preexistente en la tabla. El índice de soporte se creará como no agrupado si ya hay un índice agrupado
Puede solicitar específicamente una clave primaria agrupada o no agrupada utilizando:
PRIMARY KEY CLUSTERED
oPRIMARY KEY NONCLUSTERED
.Para ser justos, la documentación es mucho más clara sobre el tema en:
table_constraint (Transact-SQL)
fuente
La sintaxis de SQL Server para crear un índice agrupado que también es una clave principal es:
En cuanto a su comentario: "hacer que un PK use un índice con nombre", el código anterior dará como resultado que el índice de clave principal se llame "PK_c".
La clave principal y la clave de agrupación no tienen que ser las mismas columnas. Puede definirlos por separado. En el ejemplo anterior, cambie la
CLUSTERED
palabra clave aNONCLUSTERED
, y luego simplemente agregue un índice agrupado utilizando laCREATE INDEX
sintaxis:En SQL Server, el índice agrupado es la tabla, son uno y el mismo. Un índice agrupado define el orden lógico de las filas almacenadas en la tabla. En mi primer ejemplo, las filas se almacenan en el orden de los valores de las columnas
c1
yc2
. Dado que la clave de agrupación también se define como la clave principal, la combinación dec1
yc2
debe ser única en toda la tabla.En el segundo ejemplo, la clave primaria se compone de las columnas
c1
yc2
, sin embargo, la clave de agrupación es solo lac2
columna. Como no especifiqué elUNIQUE
atributo en laCREATE INDEX
declaración,c2
no es necesario que la clave de agrupación ( ) sea única en toda la tabla. SQL Server creará automáticamente un "uniquifier" y se agregará a los valores de lac2
columna para crear la clave de agrupación. Esta clave de agrupación, dado que ahora es única, se utilizará como una identificación de fila en otros índices creados en la tabla.Con el fin de demostrar la agrupación controles clave la disposición de filas de almacenamiento, puede utilizar la función de indocumentado,
fn_PhysLocCracker(%%PHYSLOC%%)
. El siguiente código muestra que las filas se presentan en el disco en el orden de lac2
columna, que he definido como la clave de agrupación:Los resultados de mi tempdb son:
En la imagen de arriba, las tres primeras columnas salen de la
fn_PhysLocCracker
función, mostrando el orden físico de las filas en el disco. Puede ver que elslot_id
valor aumenta el paso de bloqueo con elc2
valor, que es la clave de agrupación. El índice de la clave primaria almacena las filas en un orden diferente, lo que se puede ver al forzar a SQL Server a devolver resultados al escanear la clave primaria:Tenga en cuenta que no utilicé una
ORDER BY
cláusula en la declaración anterior, ya que intento mostrar el orden de los elementos en el índice de clave principal.El resultado de la consulta anterior es:
Mirando a la
fn_PhysLocCracker
función, podemos ver el orden físico del índice de la clave primaria.Dado que estamos leyendo exclusivamente del índice en sí, es decir, no se hace referencia a columnas fuera del índice en la consulta, los
%%PHYSLOC%%
valores representan las páginas en el índice en sí.Los resultados:
fuente