INSERTAR toma más de 5 horas, al insertar más de un número específico de filas

8

Al insertar menos de aproximadamente 1,350,000 filas en la tabla, todo toma aproximadamente 2 minutos, sin embargo, cuando el número de filas insertadas es mayor, el tiempo necesario para insertar datos aumenta a aproximadamente 5 horas.

El problema no está relacionado con consultas o índices, porque todo ha estado funcionando bien durante mucho tiempo y nada ha cambiado en la estructura de consultas, tablas o índices.

El problema apareció por primera vez hace aproximadamente 2 semanas y aparece repetidamente en días, cuando el número de filas insertadas es mayor que + -1,350,000. Por ejemplo, en un día, el número de filas insertadas es de 1,200,000 y el proceso lleva 2 minutos, en el otro día el número de filas es de 1,450,000 y la inserción de datos demora de 5 a 6 horas.

Traté de reconstruir índices, pero no me ayudó.

Piotr
fuente
3
¿Cuál es la fuente del inserto?
Martin Smith
44
¿Puede publicar cuál es la espera asociada cuando la inserción tarda tanto tiempo?
Kin Shah
44
Solo podemos adivinar a menos que usted brinde más información. Mi conjetura es la escalada de bloqueo que está sucediendo. ¿Puedes rastrear las esperas y bloquear la escalada
Shanky
1
¿Es la primera vez que intenta insertar 1.3 millones de registros? ¿Estás haciendo transacciones? Importación a granel? ¿Qué tipo de registro estás haciendo? Si está haciendo inserciones simples, estoy de acuerdo, intente hacer las inserciones en lotes.
SQLburn
2
¿Cómo se importan los datos (bcp, inserción masiva, SSIS, archivo por lotes)? ¿De dónde (almacenamiento local, unidad igual / diferente, almacenamiento en red, ..)? ¿Cuál es el esquema de la tabla? ¿Cuál es el comando de importación? ¿Cuál es el plan de ejecución (si es T-SQL simple)?
Marian

Respuestas:

14

Supongo que, si en realidad no está siendo bloqueado, está alcanzando un umbral por encima del cual el archivo de datos (y / o archivo de registro) tiene que crecer, y que su configuración no está optimizada para soportar este crecimiento. Asegurarse de que:

  1. La tasa de crecimiento de su archivo de datos es razonable y tiene un tamaño fijo (¡no%!) Lo suficientemente grande como para acomodar esta transacción y cualquier otra cosa que pueda estar ocurriendo simultáneamente.
  2. Lo mismo para el archivo de registro.
  3. La inicialización instantánea de archivos está habilitada . Esto ayudará a acelerar el crecimiento de los archivos de datos, pero no los crecimientos de archivos de registro a menudo más problemáticos.
  4. No está insertando 1,35 millones de filas individuales en un bucle o de lo contrario, todo como una gran transacción. Hay algo que decir para dividir sus transacciones en trozos .
Aaron Bertrand
fuente
1
Aaron es acertado con sus sugerencias que suenan como crecimiento de archivos en datos o archivos de registro. También asegúrese de que el recuento de archivos de registro virtual sea bajo.
Namphibian
4

¿Podría ser esto un problema de memoria?

Podrías ver este tipo de comportamiento si una porción de datos a la que se debe acceder repetidamente crece demasiado para la memoria y obtienes golpes de disco del infierno. Si tiene que recorrer una porción de datos que es demasiado grande para la memoria, terminará con la lectura completa del archivo de intercambio para cada pase, empujarlo más allá de ese límite puede hacer que su rendimiento caiga por un precipicio.

Loren Pechtel
fuente
3

¿Está intentando / es posible dividirlos en lotes más pequeños? Cuando me encuentro con un problema similar, agruparlos por 5.000 (con GO) realmente ha reducido el tiempo que llevó completar dicha tarea.

Alex Szabó
fuente