Должен ли я быть встревожен этим предупреждением NO JOIN PREDICATE?

20

Я устраняю неполадки неэффективной хранимой процедуры. В этом разделе процедуры выдается предупреждение 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'

Представление ( [ls]) вызывает удаленный сервер (удаленный запрос% 41 справа от плана).

Вот изображение плана:

строить планы

Я задаю этот вопрос только из-за этой записи в блоге и хочу убедиться, что это не вернется, чтобы укусить меня позже.

swasheck
источник

Ответы:

24

Потому что мы знаем это, l.id = '732820'а ls.id = l.idзатем SQL Server выводит, чтоls.id = '732820'

т.е.

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

такой же как

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

Это переписать не плохо для производительности .

Этот вывод - хорошая вещь. Это позволяет SQL Server отфильтровывать строки ... раньше, чем это было бы возможно в противном случае.

Мартин Смит
источник