Clave única vs índice único en SQL Server 2008


Tengo una tabla llamada countries y defino la columna country_name para que sea única creando un "Índice/Clave" del tipo "Clave única" en SQL Server 2008 R2.

Pero tengo las siguientes preguntas:

  1. ¿la creación de" Índice/Clave "de tipo" Clave única " creará automáticamente un índice no agrupado en esta columna?
  2. si cambio el tipo de ser "Clave única" a "Índice" y mantengo el valor IsUnique para ser "Sí",, entonces habrá alguna diferencia ?
  3. entonces, ¿por qué hay dos opciones "Clave única" e "Índice" Creo que los dos son los mismos ?
Author: abatishchev, 2012-04-22

4 answers

Una restricción única se implementa entre bastidores como un índice único, por lo que realmente no importa cómo la especifique. Tiendo a implementarlo simplemente como:

ALTER TABLE dbo.foo ADD CONSTRAINT UQ_bar UNIQUE(bar);

Algunas personas crean un índice único en su lugar, por ejemplo,

CREATE UNIQUE INDEX IX_UQ_Bar ON dbo.foo(bar);

La diferencia está en la intent - si está creando la restricción para aplicar reglas de unicidad/negocio, crea una restricción, si lo hace para ayudar al rendimiento de la consulta, podría ser más lógico crear un índice único. Una vez más, bajo el es la misma implementación, pero el camino que toma para llegar allí puede ayudar a documentar su intención.

Creo que hay múltiples opciones para adherirse tanto a la funcionalidad anterior de Sybase, así como para adherirse al estándar ANSI (a pesar de que las restricciones únicas no se adhieren al estándar 100%, ya que solo permiten un valor NULO - un índice único, por otro lado, puede trabajar alrededor de esto mediante la adición de una cláusula WHERE (WHERE col IS NOT NULL) en SQL Server 2008 y superior).

 61
Author: Aaron Bertrand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-27 19:39:44

Una cosa adicional a mencionar, es que si crea index, puede especificar columnas incluidas , esto puede ayudar a su código sql a trabajar más rápido si hay alguna búsqueda por country_name.

CREATE UNIQUE NONCLUSTERED INDEX IX_UQ_Bar
ON dbo.foo (
    bar
)
INCLUDE (foo_other_column)
GO

SELECT foo_other_column FROM Foo WHERE bar = 'test'

SQL server almacenará "foo_other_column" en el propio index. En caso de restricción única, primero encontrará el índice de 'test', luego buscará la fila en la tabla foo y solo allí tomará "foo_other_column".

 13
Author: Alexey Smolyakov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-28 09:25:21

Si está utilizando SqlMetal.exe para generar entidades DBML o LinqToSql:

  • Si una clave foránea utiliza una clave única, obtendrá una asociación como se espera.
  • Si una clave foránea utiliza un índice único, no se mostrará.

La razón está en la implementación de SqlMetal. Consulta el esquema de información de la base de datos, específicamente el uso de la columna clave. Las claves únicas están representadas allí, pero los índices únicos no.

SELECT TABLE_NAME, CONSTRAINT_NAME, COLUMN_NAME, ORDINAL_POSITION
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE;
 0
Author: Tomas Karban,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-18 09:12:49

Aparte de las excelentes respuestas anteriores, agregaría mis 2 centavos aquí.

La clave única es una restricción y utiliza un índice único para imponerse. Al igual que la clave primaria generalmente se aplica mediante un índice único agrupado. Lógicamente hablando, una restricción y un índice son dos cosas diferentes. Pero en RDBMS, una restricción se puede implementar físicamente a través de un índice.

Si se crea una tabla con una restricción única en sql server, verá un objeto de restricción y a índice único

create table dbo.t (id  int constraint my_unique_constraint unique (id));

select [Constraint]=name from sys.key_constraints 
where parent_object_id = object_id('dbo.t');

select name, index_id, type_desc from sys.indexes
where object_id = object_id('dbo.t')
and index_id > 0;

Obtendremos lo siguiente (una restricción y un índice)

introduzca la descripción de la imagen aquí

Sin embargo, si no creamos una restricción, sino solo un índice único como el siguiente

create table dbo.t2 (id int );
create unique index my_unique_constraint on dbo.t2 (id);

select [Constraint]=name from sys.key_constraints 
where parent_object_id = object_id('dbo.t2');

select name, index_id, type_desc from sys.indexes
where object_id = object_id('dbo.t2')
and index_id > 0

Verá que NO se ha creado ningún objeto de restricción (solo se ha creado un índice).

introduzca la descripción de la imagen aquí

Desde una perspectiva "teórica", en SQL Server, una restricción es un objeto con valor object_id y está vinculado a un esquema, mientras que un índice no es un objeto y no tiene valor object_id ni esquema relacionado.

 0
Author: jyao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-29 18:05:42