es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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)
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para optimizar esta consulta, se pueden seguir algunos pasos:

    1. Utilizar índices: verificar si hay índices en las columnas utilizadas en la cláusula WHERE y JOINs de la consulta. Crear índices en estas columnas puede acelerar el tiempo de ejecución.
    2. 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.

    3. 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.

    4. Utilizar UNION en lugar de UNION ALL: Si no se necesitan duplicados, utiliza UNION en lugar de UNION ALL para mejorar el rendimiento.

    5. 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:

    1. Verificar si existen índices en las columnas utilizadas en la cláusula WHERE y JOINs.

    2. Reescribir las subconsultas como JOINs:

    SELECT t1.[Condition, Specimen container, Testing Laboratory (Unit only)], t1.[Condition, Specimen container, STAT Laboratory (STAT only)], t1.[Date Specimen Collected], t1.[Specimen Source Type], t1.[Material Submitted], t1.[Specimen source site], *
    FROM #TMP_CLIA_EXPORT_ACTIVE t1
    WHERE t1.DEPT = '71'
    AND t1.[Date Specimen Collected] IS NULL
    OR EXISTS (SELECT 1 FROM #TMP_CLIA_EXPORT_ACTIVE t2
                WHERE t1.CUID = t2.CUID
                AND t2.[Condition, Specimen container, STAT Laboratory (STAT only)] IS NULL
                AND t2.[Condition, Specimen container, Testing Laboratory (Unit only)] IS NULL)
    OR EXISTS (SELECT 1 FROM #TMP_CLIA_EXPORT_ACTIVE t3
                WHERE t1.CUID = t3.CUID
                AND t3.[Specimen Source Type] IS NULL 
                AND t3.[Material Submitted] IS NULL
                AND t3.[Specimen source site] IS NULL)
    
    UNION
    
    SELECT t4.[Condition, Specimen container, Testing Laboratory (Unit only)], t4.[Condition, Specimen container, STAT Laboratory (STAT only)], t4.[Date Specimen Collected], t4.[Specimen Source Type], t4.[Material Submitted], t4.[Specimen source site], *
    FROM #TMP_CLIA_EXPORT_ARCHIVE t4
    WHERE t4.DEPT = '71'
    AND t4.[Date Specimen Collected] IS NULL
    OR EXISTS (SELECT 1 FROM #TMP_CLIA_EXPORT_ACTIVE t5
                WHERE t4.CUID = t5.CUID
                AND t5.[Condition, Specimen container, STAT Laboratory (STAT only)] IS NULL
                AND t5.[Condition, Specimen container, Testing Laboratory (Unit only)] IS NULL)
    OR EXISTS (SELECT 1 FROM #TMP_CLIA_EXPORT_ACTIVE t6
                WHERE t4.CUID = t6.CUID
                AND t6.[Specimen Source Type] IS NULL 
                AND t6.[Material Submitted] IS NULL
                AND t6.[Specimen source site] IS NULL)
    
    1. Utilizar EXISTS en lugar de IN o WHERE para mejorar el rendimiento.

    2. Utilizar UNION en lugar de UNION ALL si no se necesitan duplicados.

    3. Dividir la consulta en partes más pequeñas si se necesita una optimización adicional.

Comments are closed.