He leído que uno de los sacrificios para agregar índices de tabla en SQL Server es el mayor costo de insertar/actualizar/eliminar consultas para beneficiar el rendimiento de las consultas de selección.SQL Server Coste del índice
Puedo entender conceptualmente lo que sucede en el caso de una inserción porque SQL Server tiene que escribir entradas en cada índice que coincida con las nuevas filas, pero la actualización y eliminación son un poco más turbias para mí porque no puedo repase lo que el motor de la base de datos tiene que hacer.
Tomemos BORRAR como un ejemplo y asumir Tengo el siguiente esquema (perdón por el pseudo-SQL)
TABLE Foo
col1 int
,col2 int
,col3 int
,col4 int
PRIMARY KEY (col1,col2)
INDEX IX_1
col3
INCLUDE
col4
Ahora, si yo emita la sentencia
DELETE FROM Foo WHERE col1=12 AND col2 > 34
entiendo lo que el motor debe hacer para actualizar la tabla (o índice agrupado si lo prefiere). El índice está configurado para facilitar la búsqueda del rango de filas que se eliminarán y para hacerlo.
Sin embargo, en este punto también necesita actualizar IX_1 y la consulta que le di no ofrece una manera obvia eficiente para que el motor de la base de datos encuentre las filas para actualizar. ¿Está obligado a hacer un escaneo de índice completo en este punto? ¿El motor lee primero las filas del índice agrupado y genera una eliminación interna más inteligente frente al índice?
Me puede ayudar a entender esto si entendiera mejor lo que está sucediendo bajo el capó, pero supongo que mi verdadera pregunta es esta. Tengo una base de datos que está gastando una cantidad significativa de tiempo en eliminar y estoy tratando de averiguar qué puedo hacer al respecto.
Cuando visualizo el plan de ejecución para la eliminación, solo muestra una entrada para "Eliminar Índice Agrupado" en la tabla Foo que enumera en la sección de detalles los otros índices que necesitan actualizarse pero no recibo ninguna indicación del costo relativo de estos otros índices.
¿Son todos iguales en este caso? ¿Hay alguna manera de estimar el impacto de eliminar uno o más de estos índices sin tener que probarlo realmente?
Además de eso, el costo de bloqueo de cada índice. Con el fin de bloquear, cada índice es un recurso separado. –
@KNoodles: de hecho, el bloqueo introduce una sobrecarga adicional. (Aunque si hay muchas operaciones de bloqueo de grano fino que se llevan a cabo, pueden ser reducidas a un solo bloqueo grande para evitar la sobrecarga para el resto de la operación.) –