Чи повинен я насторожитися цим попередженням NO NO PREDICATE?


21

Я усуваю проблеми з бітами та фрагментами погано виконаної збереженої процедури. У цьому розділі процедури наводиться попередження 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'

View ( [ls]) викликає віддалений сервер (віддалений запит% 41 праворуч від плану).

Ось зображення плану:

план

Я задаю це питання лише через цю публікацію в блозі, і хочу переконатися, що це не повернеться, щоб мене кусати пізніше.

Відповіді:


25

Тому що ми це знаємо, 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 фільтрувати рядки ... раніше, ніж це було б можливо інакше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.