ฉันควรตื่นตระหนกโดยคำเตือน NO 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 ทางด้านขวาของแผน)

นี่คือภาพของแผน:

วางแผน

ฉันถามคำถามนี้เพียงเพราะโพสต์บล็อกนี้และฉันต้องการให้แน่ใจว่าจะไม่กลับมากัดฉันในภายหลัง

คำตอบ:


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 กรองแถว ... เร็วกว่าที่จะเป็นไปได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.