Devo ficar alarmado com este aviso de NO JOIN PREDICATE?

20

Estou solucionando os problemas de um procedimento armazenado com baixo desempenho. Esta seção do procedimento está lançando um aviso NO JOIN PREDICATE

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'

A view ( [ls]) chama um servidor remoto (a consulta remota% 41 à direita do plano).

Aqui está uma imagem do plano:

plano

Só faço essa pergunta por causa desta postagem no blog e quero ter certeza de que isso não voltará a me morder mais tarde.

swasheck
fonte

Respostas:

24

Porque sabemos disso l.id = '732820'e, em ls.id = l.idseguida, o SQL Server deriva issols.id = '732820'

ie

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

é o mesmo que

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

Essa reescrita não é ruim para o desempenho .

Essa derivação é uma coisa boa. Ele permite que o SQL Server filtre as linhas ... mais cedo do que seria possível.

Martin Smith
fonte