Tenemos una gran mesa [MyTable]
que en la actualidad tiene tanto una Primary Key
, y una Unique Non Clustered Index
en 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.KeyColumn
completo - 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.
fuente
Respuestas:
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
INSERT
rendimiento 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_stats
para 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.
fuente
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.
fuente
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.
fuente
The table is clustered by another column entirely.