2010-07-21 18 views
41

Me interesa saber qué técnica los desarrolladores prefieren usar para imponer la exclusividad en SQL Server: RESTRICCIÓN ÚNICA o ÍNDICE ÚNICO. Dado que hay poca diferencia en la implementación física de cada uno, ¿cómo se decide cuál es el mejor?Restricción única frente a índice único

¿Hay otras razones además del rendimiento para evaluar la mejor solución?

¿Hay ventajas de administración de bases de datos para una u otra?

Respuesta

30

Este artículo de MSDN comparación de los dos es para SQL Server 2000: http://msdn.microsoft.com/en-us/library/aa224827(SQL.80).aspx

Para la mayoría de los propósitos, no hay diferencia - la restricción se implementa como un índice bajo las sábanas. Y aunque existe la posibilidad de desactivar la restricción, en realidad no funciona en SQL Server.

Solo importa si desea ajustar cosas como FILLFACTOR, etc. de qué manera desea implementar la restricción única.

SQL Server 2008+ agregó INCLUDE para proporcionar índices de cobertura más eficientes. Índices filtrados = restricción única sobre un subconjunto de filas/ignorar múltiples nulos, etc.

+2

El artículo es bueno. Es interesante que concluye "que no hay diferencia práctica" aparte de los metadatos. – bobs

+0

tut, tut citando MSDN para SQL Server 2000 – gbn

+2

@gbn: cierto, pero ¿ha cambiado algo? –

26

Son not significantly different. Cuando crea una restricción única, SQL Server creará automáticamente un índice único para usted.

Con la sintaxis para crear un índice, es posible que tenga un mejor control de la definición de un índice único para especificar agrupado/no agrupado, incluidas las columnas, grupo de archivos, filtrado de índice (SqlSvr2008), etc.

Una restricción es preferible en la mayoría casos porque expresa la intención de la unicidad: es una restricción. Un índice no transmite esta intención.

En cuanto a la manejabilidad, el impacto es mínimo. Puede administrar el índice (reconstruir, reorganizar) como si se hubiera creado independientemente de la restricción. La única diferencia es que la restricción depende del índice, por lo que para soltar el índice, también debe soltar la restricción.

+1

+1 Yo también diría consistencia, así como a menudo terminarás cambiando una restricción a un índice de todos modos para agregar un INCLUDE – gbn

1

Una restricción única implica unicidad únicamente y la eliminación de la restricción eliminará el índice creado por el motor. Un índice puede ser alterado para eliminar su singularidad y usted todavía tiene su índice. Creo que se puede suponer que la mayoría de las columnas obligarían a la singularidad también serviría como un índice por razones de rendimiento; ergo, utilizo principalmente índices únicos. Utilizo restricciones únicas solo en las columnas que deben ser únicas pero que tienen un rendimiento deficiente (es decir, un varchar (200) que debe ser único); en tal caso, quiero señalar claramente que es una idea única pero probablemente no tan buena para buscar a pesar del índice subyacente.

2

Mis dos centavos: Usaría una restricción cuando quisiera describir la lógica comercial y un índice cuando quisiera mejorar el rendimiento. El hecho de que puedan implementarse de la misma manera en un SGBD no significa que la distinción entre los motivos para definir estos objetos no sea significativa.

Cuestiones relacionadas