Optimización de rendimiento de inserción de tabla de servidor SQL

8

Ajuste

En un datawarehouse, estoy uniendo una tabla de hechos a 20 dimensiones. La tabla de hechos tiene 32 millones de filas y 30 columnas. Esta es una tabla de etapas temporal, por lo que no tengo que lidiar con otros usuarios que leen o escriben en la tabla. Selecciono 10 columnas de la tabla base y 20 columnas de las dimensiones respectivas. Las tablas de dimensiones son pequeñas (entre 3 y 15,000 filas). Los campos en los que se unen son enteros y nvarchars. Yo uso una instrucción SELECT ... INTO. No hay índices en las tablas.

La velocidad de ejecución de esta consulta es demasiado lenta para ser útil.

Soluciones probadas

Debido a que la consulta tarda demasiado en procesarse, probé las siguientes soluciones:

  1. Divida las 20 combinaciones en 4 combinaciones en 5 tablas. Sin embargo, el rendimiento de la consulta sigue siendo bajo.
  2. Ponga índices en las columnas de clave externa. Sin disminución significativa del tiempo.
  3. Asegúrese de que los campos de la condición de unión sean enteros. Noté un aumento del rendimiento del 25%. No es exactamente lo que estoy buscando.
  4. Use una inserción en la declaración en lugar de seleccionar en. Peor rendimiento debido al crecimiento del archivo de registro, aunque la base de datos está en modo de recuperación simple.

Estos hallazgos me llevaron a incluir el plan de ejecución real que muestra que el 89% del costo se encuentra en el inserto de la tabla . Los otros costos son el 8% de escaneo de la tabla en la tabla de hechos y el 2% en la coincidencia de hash para las uniones internas.

Preguntas

  1. ¿Cuáles son las posibles razones de la inserción lenta de la tabla?
  2. ¿Cuáles son las formas de identificar este cuello de botella sin el plan de ejecución?
  3. ¿Qué acciones puedo tomar para reducir el costo de la inserción de la tabla?
Drizzt
fuente
SELECT INTO es el método DML de inserción más rápido que existe. ¿Qué rendimiento está obteniendo en filas / seg y MB / seg? Quizás es simplemente cerca del máximo esperado. ¿Qué versión de servidor es esta?
Usr
Los porcentajes en el plan real son estimaciones, no los porcentajes reales. El uso de "estadísticas io" podría revelar algo importante.
James Z

Respuestas:

12

¿Cuáles son las posibles razones de la inserción lenta de la tabla? ¿Cuáles son las formas de identificar este cuello de botella sin el plan de ejecución?

Lea Cómo analizar el rendimiento de SQL Server , especialmente la parte sobre Análisis de tiempos de espera de ejecución de consultas individuales .

¿Qué acciones puedo tomar para reducir el costo de la inserción de la tabla?

Eso dependería en gran medida del resultado del análisis de rendimiento. En primer lugar, asegúrese de que la parte SELECT sea ​​lo más rápida posible. Suponiendo que ese problema es la inserción de un solo hilo totalmente registrado, algunas soluciones son:

Remus Rusanu
fuente
También verifique la fragmentación interna y externa si primero se eliminan muchas filas extendidas de la tabla.
Ian Ringrose
1

A continuación se muestra mi experiencia y podría ayudar a cualquier otra persona.

Intentábamos transferir algunos datos de una base de datos a otra, también haciendo algunas transformaciones en el camino. Al probar la transformación, estábamos haciendo muchas inserciones, arreglando cosas en el camino y luego eliminando para probar la inserción nuevamente. Sin embargo, después de algunas inserciones y truncamientos, nuestras consultas comenzaron a ejecutarse lentamente y una inserción simple comenzó a tomar hasta 9 minutos, mientras que anteriormente se ejecutó durante unos 3 minutos.

  1. Bueno, primero comenzamos a buscar la optimización de SELECT. En lugar de subconsultas, usamos #tempTables. Si bien esto aceleró un poco las cosas, todavía no era satisfactorio.
  2. Lo que marcó la diferencia fue una reconstrucción del índice y una actualización de las estadísticas en la base de datos de destino y eso llevó la inserción a alrededor de 2 minutos.

Pruebe estas dos estrategias y vea cómo funciona para usted.

Kleidi
fuente