¿Debería estar alarmado por esta advertencia NO SE UNE A PREDICADO?

20

Estoy solucionando los problemas de un procedimiento almacenado de bajo rendimiento. Esta sección del procedimiento arroja una advertencia PREDICAR NO UNIRSE

select
    method = 
        case methoddescription 
            when 'blah' then 'Ethylene Oxide'
            when NULL then 'N/A'
            else methoddescription
        end,
    testmethod = 
        case methoddescription 
            when 'blah' then 'Biological Indicators'
            when NULL then 'N/A'
            else 'Dosimeter Reports'
        end,
    result = 
        case when l.res is null or l.res <> 1 then 'Failed'
        else 'Passed'
        end,
    datecomplete = COALESCE(CONVERT(varchar(10), NULL, 101),'N/A')
from db2.dbo.view ls
    join db1.dbo.table l
        on ls.id = l.id
    where item = '19003'
        and l.id = '732820'

La vista ( [ls]) llama a un servidor remoto (la consulta remota% 41 a la derecha del plan).

Aquí hay una imagen del plan:

plan

Solo hago esta pregunta debido a esta publicación de blog y quiero asegurarme de que no vuelva a morderme más tarde.

swasheck
fuente

Respuestas:

24

Porque sabemos eso l.id = '732820'y ls.id = l.idluego SQL Server deriva quels.id = '732820'

es decir

FROM   db2.dbo.VIEW ls
       JOIN db1.dbo.table l
         ON ls.id = l.id
WHERE  l.id = '732820' 

es lo mismo que

  ( /*...*/ FROM   db2.dbo.VIEW ls WHERE id = '732820'  )
   CROSS JOIN 
  ( /*...*/  FROM   db1.dbo.table l WHERE id = '732820'  )

Esta reescritura no es mala para el rendimiento .

Esta derivación es algo bueno. Permite que SQL Server filtre filas ... antes de lo que de otra forma sería posible.

Martin Smith
fuente