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?