Dada alguna tabla con una clave primaria, por ejemplo:
CREATE TABLE Customers (
CustomerID int NOT NULL PRIMARY KEY,
FirstName nvarchar(50),
LastName nvarchar(50),
Address nvarchar(200),
Email nvarchar(260)
--...
)
Tenemos una clave primaria única CustomerID
.
Tradicionalmente, podría necesitar algunos índices de cobertura adicionales; por ejemplo para encontrar rápidamente un usuario por CustomerID
o Email
:
CREATE INDEX IX_Customers_CustomerIDEmail ON Customers
(
CustomerID,
Email
)
Y estos son los tipos de índices que he creado durante décadas.
No es necesario que sea único, pero en realidad lo es
El índice en sí existe para evitar un escaneo de tabla; es un índice de cobertura para ayudar al rendimiento (el índice no existe como una restricción para imponer la unicidad).
Hoy recordé un poco de información: SQL Server puede usar el hecho de que:
- una columna tiene una restricción de clave externa
- una columna tiene un índice único
- se confía en una restricción
para ayudarlo a optimizar la ejecución de su consulta. De hecho, de la Guía de diseño de índices de SQL Server :
Si los datos son únicos y desea que se aplique la unicidad, la creación de un índice único en lugar de un índice no único en la misma combinación de columnas proporciona información adicional para el optimizador de consultas que puede producir planes de ejecución más eficientes . En este caso, se recomienda crear un índice único (preferiblemente creando una restricción ÚNICA).
Dado que mi índice de varias columnas contiene la clave principal, este índice compuesto será de hecho único. No es una restricción que particularmente necesito que SQL Server aplique durante cada inserción o actualización; pero el hecho es que este índice no agrupado es único.
¿Hay alguna ventaja en marcar este índice único de facto como realmente único?
CREAR ÍNDICE ÚNICO IX_Clientes_CustomerIDEmail EN Clientes ( Identificación del cliente, Correo electrónico )
Me parece que SQL Server podría ser lo suficientemente inteligente como para darse cuenta de que mi índice ya es único en virtud del hecho de que contiene la clave primaria.
- Pero tal vez no lo sepa, y hay una ventaja para el optimizador si declaro el índice como único de todos modos.
- Excepto que tal vez eso podría conducir a una desaceleración durante las inserciones y actualizaciones, donde debe realizar comprobaciones de unicidad, donde antes nunca antes había tenido que hacerlo.
- A menos que sepa, se garantiza que el índice ya sea único, porque contiene la clave primaria.
No puedo encontrar ninguna guía de Microsoft sobre qué hacer cuando un índice compuesto contiene la clave primaria.
Los beneficios de los índices únicos incluyen los siguientes:
- Se garantiza la integridad de los datos de las columnas definidas.
- Se proporciona información adicional útil para el optimizador de consultas.
¿Debo marcar un índice compuesto como único si ya contiene la clave primaria? ¿O puede SQL Server resolver esto por sí mismo?