Sollte mich diese Warnung, KEIN MITGLIED WERDEN, alarmieren?

20

Ich behebe die Fehler einer gespeicherten Prozedur mit schlechter Leistung. In diesem Abschnitt der Prozedur wird die Warnung NO JOIN PREDICATE ausgegeben

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'

Die view ( [ls]) ruft einen Remote-Server auf (die Remote-Abfrage% 41 rechts im Plan).

Hier ist ein Bild des Plans:

planen

Ich stelle diese Frage nur wegen dieses Blogposts und ich möchte sicherstellen, dass dies nicht zurückkommt, um mich später zu beißen.

Swasheck
quelle

Antworten:

24

Weil wir das wissen l.id = '732820'und ls.id = l.idSQL Server das dann ableitetls.id = '732820'

dh

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

ist das gleiche wie

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

Diese Rewrite ist für die Leistung nicht schlecht .

Diese Herleitung ist eine gute Sache. Es ermöglicht SQL Server, Zeilen herauszufiltern ... früher als sonst möglich.

Martin Smith
quelle