Cuando quiero que una columna tenga valores distintos, puedo usar una restricción
create table t1(
id int primary key,
code varchar(10) unique NULL
);
go
o puedo usar un índice único
create table t2(
id int primary key,
code varchar(10) NULL
);
go
create unique index I_t2 on t2(code);
Las columnas con restricciones únicas parecen ser buenas candidatas para índices únicos.
¿Hay alguna razón conocida para usar restricciones únicas y no usar índices únicos en su lugar?
Respuestas:
Bajo el capó se implementa una restricción única de la misma manera que un índice único: se necesita un índice para cumplir de manera eficiente el requisito de hacer cumplir la restricción. Incluso si el índice se crea como resultado de una restricción ÚNICA, el planificador de consultas puede usarlo como cualquier otro índice si lo ve como la mejor manera de abordar una consulta determinada.
Por lo tanto, para una base de datos que admite ambas características, la elección de cuál usar se reducirá a menudo al estilo y la consistencia preferidos.
Si planea usar el índice como un índice (es decir, su código puede depender de la búsqueda / clasificación / filtrado en ese campo para ser rápido), usaría explícitamente un índice único (y comentaría la fuente) en lugar de una restricción para hacer eso claro: de esta manera, si el requisito de unicidad se cambia en una revisión posterior de la aplicación, usted (u otro codificador) sabrá para asegurarse de que se coloca un índice no único en lugar del único (solo eliminar una restricción única eliminaría el índice por completo). También se puede nombrar un índice específico en una pista de índice (es decir, WITH (INDEX (ix_index_name)), que no creo que sea el caso del índice creado detrás de escena para gestionar la unicidad, ya que es poco probable que sepas su nombre.
Del mismo modo, si solo necesita imponer la unicidad como una regla de negocio en lugar de que el campo deba buscarse o usarse para ordenar, entonces usaría la restricción, nuevamente para hacer que el uso previsto sea más obvio cuando alguien más mira la definición de su tabla.
Tenga en cuenta que si usa una restricción única y un índice único en el mismo campo, la base de datos no será lo suficientemente brillante como para ver la duplicación, por lo que terminará con dos índices que consumirán espacio adicional y ralentizarán las inserciones / actualizaciones de fila.
fuente
CREATE TABLE #T(X INT CONSTRAINT PK PRIMARY KEY NONCLUSTERED);SELECT * FROM #T WITH(INDEX(PK)) WHERE X = 1
. Sin embargo, los índices pueden ser más flexibles porque las restricciones no admiten todas las opciones de índice, comoINCLUDE
columnas d o índices filtrados.Además de los puntos en otras respuestas, aquí hay algunas diferencias clave entre los dos.
Nota: Los mensajes de error son de SQL Server 2012.
Errores
La violación de una restricción única devuelve el error 2627.
La violación de un índice único devuelve el error 2601.
Deshabilitar
Una restricción única no se puede deshabilitar.
Pero el índice único detrás de una restricción de clave principal o una restricción única se puede deshabilitar, al igual que cualquier índice único. Hat-tip Brain2000.
Tenga en cuenta la advertencia habitual de que deshabilitar un índice agrupado hace que los datos sean inaccesibles.
Opciones
Las restricciones únicas admiten opciones de indexación como
FILLFACTOR
yIGNORE_DUP_KEY
, aunque este no ha sido el caso para todas las versiones de SQL Server.Columnas Incluidas
Los índices no agrupados pueden incluir columnas no indexadas (denominadas índice de cobertura, esta es una mejora importante del rendimiento). Los índices detrás de las restricciones PRIMARY KEY y UNIQUE no pueden incluir columnas. Punta de sombrero @ypercube.
Filtración
Una restricción Unique no se puede filtrar.
Se puede filtrar un índice único.
Restricciones de clave extranjera
Una restricción de clave externa no puede hacer referencia a un índice único filtrado, aunque puede hacer referencia a un índice único no filtrado (creo que esto se agregó en SQL Server 2005).
Nombrar
Al crear una restricción, especificar un nombre de restricción es opcional (para los cinco tipos de restricciones). Si no especifica un nombre, MSSQL generará uno para usted.
Al crear índices, debe especificar un nombre.
Punta de sombrero @ i-one.
Enlaces
http://technet.microsoft.com/en-us/library/aa224827(v=SQL.80).aspx
http://technet.microsoft.com/en-us/library/ms177456.aspx
fuente
Para citar a MSDN como una fuente autorizada:
Y...
Otro en: https://technet.microsoft.com/en-us/library/aa224827%28v=sql.80%29.aspx
fuente
Una de las principales diferencias entre una restricción única y un índice único es que una restricción de clave externa en otra tabla puede hacer referencia a columnas que conforman una restricción única. Esto no es cierto para los índices únicos. Además, las restricciones únicas se definen como parte del estándar ANSI, mientras que los índices no. Finalmente, se considera que la restricción única vive en el ámbito del diseño de bases de datos lógicas (que pueden ser implementadas de manera diferente por diferentes motores de base de datos) mientras que el índice es un aspecto físico. Por lo tanto, la restricción única es más declarativa. Prefiero una restricción única en casi todos los casos.
fuente
En Oracle, una diferencia importante es que puede crear un índice de función única, que no es factible con restricciones únicas:
Por ejemplo
Por
fk_xyz
lo tanto, es único para el registro que tienenamount != 0
.fuente
WHERE
cláusula.CREATE UNIQUE NONCLUSTERED INDEX P4_U ON DBO.P4 ( PID ) WHERE TXT = 'qwert' ;
Se prefiere la restricción ÚNICA sobre el índice ÚNICO. Cuando la restricción no es única, debe usar un índice regular o no único. La restricción también es otro tipo de índice. El índice se usa para un acceso más rápido.
Los índices únicos pueden tener cláusulas where. Por ejemplo, puede crear índices para cada año en función de la columna de fecha
fuente