Haruskah saya khawatir dengan peringatan TIDAK BERGABUNG DENGAN PREDIKAT INI?

20

Saya memecahkan masalah sedikit demi sedikit dari prosedur tersimpan yang berkinerja buruk. Bagian dari prosedur ini memberikan peringatan TIDAK BERGABUNG DENGAN PREDIKAT

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'

Tampilan ( [ls]) memanggil server jauh (kueri jarak jauh% 41 di sebelah kanan paket).

Ini adalah gambar dari rencana:

rencana

Saya hanya mengajukan pertanyaan ini karena posting blog ini dan saya ingin memastikan ini tidak akan kembali menggigit saya nanti.

swasheck
sumber

Jawaban:

24

Karena kita tahu itu l.id = '732820'dan ls.id = l.idkemudian SQL Server mendapatkannyals.id = '732820'

yaitu

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

sama dengan

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

Penulisan ulang ini tidak buruk untuk kinerja .

Derivasi ini adalah hal yang baik. Ini memungkinkan SQL Server untuk memfilter baris ... lebih awal dari yang mungkin terjadi.

Martin Smith
sumber