2010-09-21 8 views
7

Por razones de argumentos, digamos que es para SQL 2005/8. Entiendo que cuando coloca índices en una tabla para sintonizar las declaraciones SELECT, estos índices deben mantenerse durante las acciones INSERT/UPDATE/DELETE.¿Cuándo MS-SQL mantiene los índices de tabla?

Mi pregunta principal es la siguiente:

Cuando se SQL Server mantener índices de una tabla?

Tengo muchas preguntas siguientes:

ingenuamente por sentado que lo hará después de un comando ha ejecutado. Supongamos que está insertando 20 filas, mantendrá el índice después de que se hayan insertado y comprometido 20 filas.

  • ¿Qué ocurre en la situación en la que una secuencia de comandos cuenta con varias instrucciones contra una mesa, pero por lo demás son declaraciones distintas?

  • ¿El servidor tiene la inteligencia para mantener el índice después de todos instrucciones se ejecutan o se hacen que por estado de cuenta?

que he visto situaciones en las que los índices se eliminan y reconstruyen después de muchos grandes/INSERT/UPDATE acciones.

  • Se supone que esto incurre en la reconstrucción de los índices de la entera de mesa, incluso si sólo se cambia un puñado de filas?

  • Habría una mejora en el rendimiento en el intento de recopilar INSERT y UPDATE acciones en un lote más grande, decir mediante la recopilación de filas para insertar en una tabla temporal , en lugar de hacer muchas inserciones más pequeñas?

  • ¿Cómo se comparan las filas de arriba contra la caída de un índice en lugar de tomar el golpe de mantenimiento?

Disculpe la proliferación de preguntas, es algo que siempre he tenido en cuenta, pero al intentar ajustar un guión para obtener un equilibrio, descubro que no sé realmente cuándo se produce el mantenimiento del índice.

Edit: Entiendo que las preguntas de rendimiento dependen en gran medida de la cantidad de datos durante la inserción/actualización y el número de índices. De nuevo por razones de argumentos, tendría dos situaciones:

  • Se selecciona una tabla de índices pesados ​​para .
  • Una mesa de luz de índice (PK).

Ambas situaciones tendrían un gran lote de inserción/actualización, por ejemplo, 10k + filas.

Editar 2: Soy consciente de poder crear un guión determinado en un conjunto de datos. Sin embargo, perfilar no me dice por qué un enfoque dado es más rápido que otro. Estoy más interesado en la teoría detrás de los índices y donde surgen los problemas de rendimiento, no una respuesta definitiva de "esto es más rápido que eso".

Gracias.

+0

Buena pregunta. Para la segunda parte, dependerá por completo de la cantidad y el contenido de los índices en cuanto a si es más rápido colocar y reconstruir o simplemente actualizar sobre los índices. Como la mayoría de las cosas en SQL, no hay ninguna respuesta o método que sea correcto el 100% del tiempo. – JNK

+0

@JNK Supongo que tanto, espero que alguien pueda bloquear la situación o explicar en qué situaciones un enfoque determinado comienza a ser costoso. –

Respuesta

3

Cuando se completa su resumen (ni siquiera la transacción), todos sus índices están actualizados. Cuando se compromete, todos los cambios se vuelven permanentes y se liberan todos los bloqueos. Hacer lo contrario no sería "inteligencia", violaría la integridad y posiblemente causaría errores.

Editar: por "integridad" me refiero a esto: una vez confirmado, los datos deberían estar inmediatamente disponibles para cualquier persona. Si los índices no están actualizados en ese momento, alguien puede obtener resultados incorrectos.

A medida que aumente el tamaño del lote, su rendimiento mejorará originalmente, luego se ralentizará. Necesita ejecutar sus propios puntos de referencia y conocer su tamaño de lote óptimo. Del mismo modo, debe comparar para determinar si es más rápido eliminar/recrear índices o no.

Editar: si inserta/actualiza/elimina lotes de filas en una declaración, los índices se modifican una vez por cada extracto. La siguiente secuencia de comandos demuestra que:

CREATE TABLE dbo.Num(n INT NOT NULL PRIMARY KEY); 
GO 
INSERT INTO dbo.Num(n) 
SELECT 0 
UNION ALL 
SELECT 1; 
GO 
-- 0 updates to 1, 1 updates to 0 
UPDATE dbo.Num SET n = 1-n; 
GO 
-- doing it row by row would fail no matter how you do it 
UPDATE dbo.Num SET n = 1-n WHERE n=0; 
UPDATE dbo.Num SET n = 1-n WHERE n=1; 
+0

Hubiera pensado que la integridad de los datos no se aplicaba a un índice. ¿Es esto solo en el caso de restricciones únicas? –

+0

Si el índice no tiene integridad, es bastante inútil. No estoy seguro de qué pasaría si SQL utilizara un índice para encontrar un registro que DEBERÍA estar allí, pero ese registro no. Supongo que obtendrías negativos falsos, lo que más bien derrota el propósito de ACID. – JNK

+0

Entonces, ¿el índice se mantiene fila por fila a medida que los valores se insertan/actualizan? Es decir, aterrizan automáticamente en la ubicación correcta según los índices y los índices se modifican cuando es necesario. Entonces, incluso si las inserciones de fila se agrupan juntas, no debería haber una diferencia discernible frente a varias inserciones más pequeñas. Ahora que lo pienso, supongo que hay una sobrecarga con cambios de índice comprometidos y bloqueo de tabla ... –

Cuestiones relacionadas