क्या मुझे इस 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 सर्वर व्युत्पन्न है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 सर्वर को पंक्तियों को फ़िल्टर करने की अनुमति देता है ... पहले की तुलना में अन्यथा संभव होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.