2012-04-21 12 views
42

Tengo una tabla llamada countries y defino que la columna country_name sea única al crear un "índice/clave" de tipo "clave única" en SQL Server 2008 R2.clave única frente a índice exclusivo en SQL Server 2008

Pero tengo las siguientes preguntas:

  1. se crean “Indice/clave” de tipo “Clave única” crear automáticamente un índice no agrupado en esta columna?
  2. si cambio el tipo de "Clave única" a "Índice" y mantengo el valor IsUnique en "Sí", ¿habrá alguna diferencia?
  3. Entonces, ¿por qué hay dos opciones "clave única" e "índice", creo que los dos son iguales?

Respuesta

59

Una restricción única se implementa detrás de las escenas como un índice único, por lo que realmente no importa cómo lo 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, p.

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

La diferencia está en la intención - si va a crear la restricción para hacer cumplir las reglas/negocio singularidad, se crea una restricción, si es que lo están haciendo para ayudar a rendimiento de las consultas, puede ser que sea más lógico para crear una índice único. Nuevamente, bajo las sábanas, es la misma implementación, pero el camino que tome para llegar puede ayudar a documentar su intención.

Creo que hay múltiples opciones para cumplir tanto con la funcionalidad anterior de Sybase como para cumplir con el estándar ANSI (aunque las restricciones únicas no se adhieren al estándar 100%, ya que solo permiten un valor NULL - el índice único, por otro lado, puede evitar esto agregando una cláusula WHERE (WHERE col IS NOT NULL) en SQL Server 2008 y posteriores).

+0

No estoy seguro de si se trata solo de diferenciación de información, pero 'sys.indexes' tiene la columna' is_unique_constraint' para indicar si el índice se define como una restricción en lugar de un índice único. –

+1

@andre Yep, eso es una columna en los metadatos, por lo que un * usuario * puede decir si se declaró originalmente como una restricción. Eso no le dice nada acerca de la intención, y la implementación física del índice en sí mismo y la aplicación de la unicidad es la misma. –

10

Una cosa adicional a mencionar, es que si crea un índice, puede especificar las columnas incluidas, esto puede ayudar a que su código sql funcione 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' 

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

Cuestiones relacionadas