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:
- Divida las 20 combinaciones en 4 combinaciones en 5 tablas. Sin embargo, el rendimiento de la consulta sigue siendo bajo.
- Ponga índices en las columnas de clave externa. Sin disminución significativa del tiempo.
- 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.
- 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
- ¿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?
- ¿Qué acciones puedo tomar para reducir el costo de la inserción de la tabla?
fuente
Respuestas:
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 .
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:
Use el interruptor de partición para mover 'en' los datos. Esta es, de lejos, la mejor solución. Prepare los datos de preparación en una tabla de etapas separada, luego cambie esta tabla de etapas a la tabla DW. Lea la transferencia de datos de manera eficiente mediante el cambio de partición .
Asegúrese de que INSERT esté mínimamente registrado. Lea las operaciones que se pueden registrar mínimamente y los requisitos previos para el registro mínimo . Incluso si usa operaciones de cambio de partición, vale la pena asegurarse de que la construcción de la tabla de etapas se registre mínimamente.
Asegúrese de que su subsistema IO sea capaz de conducir una carga rápida. Lea Presentación de SSD .
fuente
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.
Pruebe estas dos estrategias y vea cómo funciona para usted.
fuente