Dois-je être alarmé par cet avertissement NO JOIN PREDICATE?


20

Je dépanne les éléments d'une procédure stockée peu performante. Cette section de la procédure génère un avertissement 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'

La vue ( [ls]) appelle un serveur distant (la requête distante% 41 à droite du plan).

Voici une image du plan:

plan

Je ne pose cette question qu'à cause de ce billet de blog et je veux m'assurer que cela ne reviendra pas me mordre plus tard.

Réponses:


24

Parce que nous le savons l.id = '732820'et que ls.id = l.idSQL Server en déduitls.id = '732820'

c'est à dire

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

est le même que

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

Cette réécriture n'est pas mauvaise pour les performances .

Cette dérivation est une bonne chose. Il permet à SQL Server de filtrer les lignes ... plus tôt que cela ne serait possible autrement.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.