Sé que un INSERT en una tabla SQL puede ser lento por varias razones:
- Existencia de disparadores de inserción en la mesa
- Muchas restricciones forzadas que deben verificarse (generalmente claves foráneas)
- La página se divide en el índice agrupado cuando se inserta una fila en el medio de la tabla
- Actualización de todos los índices no agrupados relacionados
- Bloqueo de otra actividad en la mesa
- Mal tiempo de respuesta de escritura de E / S
- ... algo que me perdí?
¿Cómo puedo saber cuál es el responsable en mi caso específico? ¿Cómo puedo medir el impacto de las divisiones de página frente a las actualizaciones de índice no agrupadas frente a todo lo demás?
Tengo un proceso almacenado que inserta alrededor de 10,000 filas a la vez (desde una tabla temporal), lo que toma alrededor de 90 segundos por cada 10k filas. Eso es inaceptablemente lento, ya que hace que otros spids se agoten.
He mirado el plan de ejecución, y veo la tarea INSERTAR ÍNDICE CLUSIFICADO y todas las BÚSQUEDAS DE ÍNDICE de las búsquedas de FK, pero todavía no me dice con certeza por qué lleva tanto tiempo. Sin desencadenantes, pero la tabla tiene un puñado de teclas F (que parecen estar indexadas correctamente).
Esta es una base de datos SQL 2000.
Respuestas:
Algunas cosas que puedes mirar ...
Reduzca el tamaño del lote de 10000 a algo más pequeño, como 2000 o 1000 (no dijo qué tan grande es el tamaño de su fila).
Intente activar IO Stats para ver cuánto IO están tomando las búsquedas FK.
¿Cuál es la espera causada cuando ocurre la inserción (master.dbo.sysprocesses)?
Comencemos aquí y veamos a dónde vamos.
fuente
Puntilla,
Debe examinar las estadísticas de espera para su consulta. Con SQL2000 puede usar la sintaxis DBCC SQLPERF ("waitstats") para obtener esos detalles.
fuente
Puedo decir lo que estoy buscando al analizar el rendimiento de una consulta. Quizás ayude.
fuente
Intenta usar:
y
ESTADÍSTICAS IO
PERFIL ESTADÍSTICO
fuente