2008-10-21 19 views
13

Al crear un índice sobre una columna que se va a ser único (pero no la clave primaria de la tabla), let servidor SQL de a elegir algunas opciones:¿Cuál es la diferencia entre crear un índice UNIQUE como "índice" o como "restricción" en SQL Server?

1) Puedo elegir para que sea una restricción o un índice.
Supongo que esto significa que si lo configuro como una restricción, no lo usará cuando consulte, solo cuando escriba. Sin embargo, la única forma eficiente en que se me ocurre que SQL Server haga cumplir esa restricción es creando realmente un índice. ¿Cuál es el uso para esta opción?

2) Además, si lo configuro como "índice", me permite especificar que debe ignorar las claves duplicadas. Esto es lo más desconcertante para mí ...
Supongo que significa lo opuesto a la restricción. Probablemente signifique "usarlo al consultar, pero ni siquiera verificar cuando se escribe".
Pero entonces ¿por qué debería establecerlo como ÚNICO?
Supongo que hay algunas optimizaciones que SQL Server puede hacer, pero me gustaría entenderlas mejor.

¿Alguien sabe exactamente qué hace SQL Server con estas opciones?
¿Cuál es el caso de uso para establecer un índice único, pero ignorar las claves duplicadas?

NOTA: Esto es para SQL Server 2000


EDIT: De acuerdo con lo que ha dicho, sin embargo ... Si creo una restricción, que se puede utilizar para acelerar las consultas que filtran utilizando los campos en la restricción?

Gracias!

+0

Siempre me he preguntado sobre esta diferencia. La diferencia entre un índice único y una restricción única. – leppie

Respuesta

7

Una restricción UNIQUE es parte del estándar ISO/ANSI SQL, mientras que los índices no se deben a que el Estándar sea independiente de la implementación. SQL Server, en común con la mayoría de los DBMS SQL, usará un índice para implementar una restricción UNIQUE.

Podría decirse que, en lugar de usar UNIQUE índice en una secuencia de comandos SQL es ligeramente más portátil pero como siempre la sintaxis propia no debe descartarse si provids oportunidades para la optimización etc.

5

SQL Server creará un índice para implementar restricciones ÚNICAS. Puede ver una referencia al índice exclusivo que se utiliza para imponer restricciones únicas en la vista sys.key_constraints (en 2005 — lo siento, no conozco el equivalente de 2000). Pero ambas versiones usarán el índice al realizar consultas.

La diferencia es que si creas un índice tienes más control sobre cómo está construido. En particular, puede incluir columnas adicionales que pueden buscarse frecuentemente junto con la clave.

Ambas opciones le permitirá "Ignorar duplicados de las llaves" en la datos existentes, pero ambos se producirá un error si se intenta insertar un valor nueva que duplica uno ya existente.

2

No existe una diferencia práctica entre una restricción única y un índice único que no sea el hecho de que la restricción única también se enumera como un objeto de restricción en la base de datos.

+0

Hay una cierta ventaja al marcar algo como una clave única en lugar de un índice único, en el que las herramientas de base de datos como ORM notarán las claves únicas y pueden aprovecharlas. Las claves únicas son casi siempre mínimas y, por lo tanto, "claves candidatas", mientras que los índices únicos pueden mostrar índices regulares (que aumentan el rendimiento) marcados porque incluyen todas las columnas de una clave única (convirtiéndolas en "superclaves") y marcando index como único SQL Server puede aprovechar ese hecho en la optimización de consultas. –

+0

Kevin: una clave única es una clave principal o una restricción única. En SQL SQL Server, las restricciones únicas se implementan usando un índice. El dominio describe si algo necesita ser único, no está relacionado con el rendimiento (simplemente es un efecto secundario) –

+0

De hecho, quise decir una restricción única en todos los lugares donde se me proporcionó una "clave única". Mi publicación estaba destinada a señalar la diferencia semántica, incluso si SQL Server los trata de forma idéntica. Una versión futura de SQL Server podría implementar contraints únicos de alguna otra manera que no proporcione ningún beneficio de búsqueda, por lo que es mejor utilizar índices únicos reales si el objetivo es el rendimiento (como regla general, estas son "superkeys") y un constancia única si el objetivo es la integración de datos (generalmente se aplica a las "claves candidatas", ya que cualquier otra cosa es un desperdicio). –

2

De acuerdo con MSDN, no hay diferencias significativas entre la creación de un índice único a través de una restricción única o la creación explícita utilizando la instrucción CREATE UNIQUE INDEX. En ambos casos, los datos se validan por singularidad de la misma manera, y también el optimizador de consultas no los trata de forma diferente. Como buena práctica, utilice una restricción única si la integridad de los datos es el objetivo, otra instrucción de uso CREATE UNIQUE INDEX directamente.

Here es un excelente artículo y un video que explica la diferencia entre ambos enfoques.

Cuestiones relacionadas