Implicaciones del uso de un índice único no agrupado con columnas de cobertura en lugar de una clave primaria

12

Tenemos una gran mesa [MyTable]que en la actualidad tiene tanto una Primary Key, y una Unique Non Clustered Indexen la misma columna ( [KeyColumn]). El índice U NC también tiene columnas de cobertura adicionales.

Tener PK e índice NC único en las mismas columnas parece redundante, por lo que estaba considerando eliminar la clave primaria y, en su lugar, usar el índice único no agrupado para propósitos de integridad referencial.

Tenga en cuenta que la tabla está agrupada por otra columna por completo.

es decir, tenemos:

ALTER TABLE [MyTable]
    ADD CONSTRAINT [PK_MyTable] 
    PRIMARY KEY NONCLUSTERED ([KeyColumn])
GO

Y

CREATE UNIQUE NONCLUSTERED INDEX [IX_MyTable_SomeIndex] 
    ON [MyTable] ([KeyColumn]) 
    INCLUDE ([Column1], [Column2])
GO

Hasta donde sé, no es posible agregar columnas de cobertura a una Clave primaria, así que tengo la intención de hacer:

  • Descarte las restricciones de clave externa dependientes de MyTable.KeyColumn
  • Suelta la clave primaria por MyTable.KeyColumncompleto
  • Vuelva a agregar las claves externas a la tabla (es decir, RI se aplicará a través de MyTable.KeyColumn)

La única implicación que se me ocurre al hacer esto es que no obtendremos el símbolo de la llave visual en nuestros diagramas ERD, y que la densidad del índice (hoja) será menor debido a las columnas incluidas.

He leído /programming/487314/primary-key-or-unique-index y estoy contento con los aspectos de integridad y rendimiento de hacer esto.

Mi pregunta es: ¿es defectuoso este enfoque?

Edite lo que estoy tratando de lograr : optimización del rendimiento y limpieza de primavera . Al eliminar el PK o un índice, se necesitarán menos páginas para mis índices = escrituras más rápidas, además de beneficios de mantenimiento / operativos, es decir, un índice menos para mantener desfragmentado, etc.

Para poner algunos antecedentes a esto, nunca antes había tenido una tabla a la que se haga referencia, sin una PK. Sin embargo, el hecho de que se haya agregado un índice NC con columnas de cobertura a la tabla significa que necesito adaptar mi pensamiento.

StuartLC
fuente
¿Podría comentar sobre lo que está tratando de lograr? También debe asegurarse de terminar al final con un índice agrupado.
@ jn29098 - Actualizado. Confirmó que tenemos un índice agrupado, en columnas que no son PK ni columnas de cobertura, por lo que esto no parece relevante para esta decisión.
StuartLC
1
¿Está seguro de que no tiene ninguna herramienta / ORM / herramienta de modelado de generación de datos que vomitará cuando vea que la PK se ha ido?
Remus Rusanu
La única desventaja que veo es que una vez que PK desaparece ... entonces solo tiene un índice en la columna de teclas y las consultas que usan el índice de PK dicen para escanear el índice en la columna de teclas u ordenar por columnas de teclas y no están cubiertas por el índice Uniuqe pueden registrar IOs algo más como páginas de índice únicas son mucho más que las de PK. De lo contrario, se ve bien. Pero algún purista dirá que deberías tener PK :)
Gulli Meel
1
Le sugiero que verifique la utilidad de ese índice utilizando el DMV de estadísticas de uso del índice y vea si está siendo utilizado por algunas de sus consultas. Compruébelo también con el índice de clave único y luego resuelva qué sucederá con la consulta usando ese index ..
Gulli Meel

Respuestas:

3

Optimización del rendimiento. Al eliminar el PK o un índice, se necesitarán menos páginas para mis índices = escrituras más rápidas, además de beneficios de mantenimiento / operativos, es decir, un índice menos para mantener desfragmentado, etc.

Debe poder demostrar que lo que se propone realmente ayudará (costo versus beneficio). ¿Por qué motivo se está considerando este cambio? ¿Existen realmente problemas de rendimiento con esta tabla, o simplemente "se ve mal"?

Aquí hay algunas otras preguntas que lo ayudarán a tomar la mejor decisión para su entorno:

  • ¿Cuánto tiempo se ahorraría en la ventana de mantenimiento? En la ventana de respaldo?

  • ¿Cuánto espacio de almacenamiento ahorraría (archivos de datos, archivos de registro, copias de seguridad, etc.)?

  • ¿El INSERTrendimiento en esta tabla es realmente un cuello de botella en este momento? ¿Cuánto mejoraría? ¿Eliminar un índice es la mejor estrategia para solucionar ese problema?

  • ¿Esto causará problemas con las herramientas y los marcos de la base de datos (ORM en particular) que esperan que cada tabla tenga una clave primaria y no solo un índice único? La replicación transaccional requiere una clave principal en las tablas publicadas.

  • ¿Es importante un esquema de base de datos autodocumentado?

  • A pesar de su uso limitado, ¿la estrechez del índice de clave principal todavía permite que el optimizador produzca planes más eficientes para ciertas consultas? (Use sys.dm_db_index_usage_statspara averiguarlo)

Hablando personalmente, por lo que nos ha dicho, lo dejaría en paz hasta que se pueda probar que (a) el índice adicional es un problema y (b) eliminarlo es la solución.

Jon Seigel
fuente
Gracias. Resulta que las estadísticas del índice mostraron que el PK todavía se usaba mucho para los escaneos. Parece que estaba siendo demasiado celoso: los beneficios de legibilidad / convención de retener el PK deberían superar cualquier implicación de almacenamiento a largo plazo. Sin embargo, el punto sobre la replicación transaccional lo confirma: tendremos que replicar esta base de datos en breve.
StuartLC
2

El único tipo de consulta en esa tabla que funcionará peor (y solo un poco peor) serán aquellas que soliciten un rango de valores de KeyColumn, ya que esas consultas en este momento serían mejor atendidas por una búsqueda de índice en su PK.

Vale la pena tener en cuenta que el costo de la verificación de integridad referencial para las tablas que hacen referencia a esta tabla será mayor (de nuevo, solo un poco más alto).

Siempre y cuando se ocupe del aspecto anulable, debería estar bien con el índice único.

Si fuera mi base de datos, probablemente elegiría el índice único único, todas las demás cosas son iguales.

Matt Whitfield
fuente
Gracias, ¿tiene algún enlace de referencia? wrt un poco peor, ¿se refiere únicamente a la menor densidad de índice en el índice de cobertura, o hay algo más que podría causar esto?
StuartLC
Desafortunadamente, es solo por mucha experiencia, ¡y chatear con personas mucho más inteligentes que yo a lo largo de los años! Y sí, es precisamente eso: habrá menos filas por página, por lo que habrá más E / S. Sin embargo, vale la pena señalar que las columnas INCLUDE solo están presentes en el nivel de la hoja. Entonces no todo es malo. Estoy seguro de que lo sabe en función de los detalles de su pregunta, pero supongo que otros lectores pueden no hacerlo.
Matt Whitfield
-2

Hasta donde sé, no es posible agregar columnas de cobertura a una Clave primaria

Si tiene un índice agrupado en KeyColumn, dado que es un índice agrupado, todas las demás columnas están implícitamente 'cubiertas'. Por lo tanto, no gana nada al agregar otro índice en KeyColumn. De hecho, reducirá la velocidad de sus inserciones y usará más espacio.

Esto se debe a que un índice agrupado no es un índice como tal, sino solo una instrucción para almacenar las filas de la tabla en el orden del índice. Y una vez que haya encontrado una fila por clave principal, entonces tiene todas las demás columnas allí mismo.

David Roussel
fuente
2
Desde el primer párrafo:The table is clustered by another column entirely.
JNK
55
Creo que podría haber alguna confusión de clave principal / índice agrupado aquí. A pesar de los mejores esfuerzos del estudio de gestión para persuadirlo, no son lo mismo.
Matt Whitfield