Resumen breve: si sus datos son intrínsecamente UNIQUE
, se beneficiará al crear un índice UNIQIE
en ellos.
Ver el artículo en mi blog para obtener una explicación detallada:
Ahora, los detalles morbosos.
Como @Mehrdad dijo que, UNIQUENESS
afecta el recuento de filas estimado en el generador de planes.
UNIQUE
índice tiene una selectividad máxima posible, por eso:
SELECT *
FROM table1 t2, table2 t2
WHERE t1.id = :myid
AND t2.unique_indexed_field = t1.value
casi seguramente utilizar NESTED LOOPS
, mientras
SELECT *
FROM table1 t2, table2 t2
WHERE t1.id = :myid
AND t2.non_unique_indexed_field = t1.value
pueden beneficiarse de un HASH JOIN
si el optimizador piensa que non_unique_indexed_field
no es selectiva.
Si el índice es CLUSTERED
(i. E. Las filas theirselves están contenidos en las hojas de índice) y no UNIQUE
, a continuación, una columna oculta especial llamada se añade uniquifier
a cada clave de índice, con lo que la clave mayor y el índice más lento.
Es por eso que el índice UNIQUE CLUSTERED
es de hecho un poco más eficiente que un non-UNIQUE CLUSTERED
.
En Oracle
, una combinación en UNIQUE INDEX
se requiere para una tal llamada key preservation
, que asegura que cada fila de una tabla se seleccionará como máximo una vez y hace una vista actualizable.
Esta consulta:
UPDATE (
SELECT *
FROM mytable t1, mytable t2
WHERE t2.reference = t1.unique_indexed_field
)
SET value = other_value
trabajarán en Oracle
, mientras éste:
UPDATE (
SELECT *
FROM mytable t1, mytable t2
WHERE t2.reference = t1.non_unique_indexed_field
)
SET value = other_value
se producirá un error.
Esto no es un problema con SQL Server
, sin embargo.
Una cosa más: de una tabla como ésta,
CREATE TABLE t_indexer (id INT NOT NULL PRIMARY KEY, uval INT NOT NULL, ival INT NOT NULL)
CREATE UNIQUE INDEX ux_indexer_ux ON t_indexer (uval)
CREATE INDEX ix_indexer_ux ON t_indexer (ival)
, esta consulta:
/* Sorts on the non-unique index first */
SELECT TOP 1 *
FROM t_indexer
ORDER BY
ival, uval
utilizará un TOP N SORT
, mientras éste:
/* Sorts on the unique index first */
SELECT TOP 1 *
FROM t_indexer
ORDER BY
uval, ival
usará solo un escaneo de índice.
Para la última consulta, no hay ningún punto en la ordenación adicional en ival
, ya que uval
son únicos de todos modos, y el optimizador tiene esto en cuenta.
En los datos de muestra de 200,000
filas (id == uval == ival
), la consulta anterior se ejecuta durante 15
segundos, mientras que la última es instantánea.
Integridad en su base de datos es casi siempre de suma importancia. –