¿Cómo puedo optimizar esta consulta que contiene dos subconsultas y una unión para que se ejecute más rápido?
¿Cómo puedo optimizar esta consulta? Tarda más de 10 minutos en ejecutarse y la tabla temporal en la que se está ejecutando solo tiene 1.4 millones de registros.
select [Condición, Contenedor de muestras, Laboratorio de pruebas (solo unidad)], [Condición, Contenedor de muestras, Laboratorio de STAT (solo STAT)], [Fecha de recolección de la muestra],[Tipo de fuente de la muestra], [Material enviado], [Sitio de origen de la muestra], *
from #TMP_CLIA_EXPORT_ACTIVE
WHERE DEPT = '71'
AND [Fecha de recolección de la muestra] IS NULL
OR CUID IN (SELECT CUID FROM #TMP_CLIA_EXPORT_ACTIVE
WHERE [Condición, Contenedor de muestras, Laboratorio de STAT (solo STAT)] IS NULL
AND [Condición, Contenedor de muestras, Laboratorio de pruebas (solo unidad)] IS NULL)
OR CUID IN (SELECT CUID FROM #TMP_CLIA_EXPORT_ACTIVE
WHERE [Tipo de fuente de la muestra] IS NULL
AND [Material enviado] IS NULL
AND [Sitio de origen de la muestra] IS NULL)
union all
select [Condición, Contenedor de muestras, Laboratorio de pruebas (solo unidad)], [Condición, Contenedor de muestras, Laboratorio de STAT (solo STAT)], [Fecha de recolección de la muestra],[Tipo de fuente de la muestra], [Material enviado], [Sitio de origen de la muestra], *
from #TMP_CLIA_EXPORT_ARCHIVE
WHERE DEPT = '71'
AND [Fecha de recolección de la muestra] IS NULL
OR CUID IN (SELECT CUID FROM #TMP_CLIA_EXPORT_ACTIVE
WHERE [Condición, Contenedor de muestras, Laboratorio de STAT (solo STAT)] IS NULL
AND [Condición, Contenedor de muestras, Laboratorio de pruebas (solo unidad)] IS NULL)
OR CUID IN (SELECT CUID FROM #TMP_CLIA_EXPORT_ACTIVE
WHERE [Tipo de fuente de la muestra] IS NULL
AND [Material enviado] IS NULL
AND [Sitio de origen de la muestra] IS NULL)
davy.ai
Para optimizar esta consulta, se pueden seguir algunos pasos:
Reescribir subconsultas como JOINs: Las subconsultas se pueden reescribir como JOINs, lo cual a menudo resulta en un mejor rendimiento que las subconsultas. Esto se puede hacer uniendo las tablas de la subconsulta en la propia consulta.
Utilizar EXISTS: Si estás verificando si existe un registro en otra tabla, utiliza EXISTS en lugar de IN o WHERE para mejorar el rendimiento.
Utilizar UNION en lugar de UNION ALL: Si no se necesitan duplicados, utiliza UNION en lugar de UNION ALL para mejorar el rendimiento.
Dividir la consulta en partes más pequeñas: Si la consulta es demasiado compleja, divídela en partes más pequeñas y ejecuta cada parte por separado.
Entonces, en esta consulta específica, se pueden aplicar los pasos anteriores de la siguiente manera:
Verificar si existen índices en las columnas utilizadas en la cláusula WHERE y JOINs.
Reescribir las subconsultas como JOINs:
Utilizar EXISTS en lugar de IN o WHERE para mejorar el rendimiento.
Utilizar UNION en lugar de UNION ALL si no se necesitan duplicados.
Dividir la consulta en partes más pequeñas si se necesita una optimización adicional.