मेरे पास नीचे का प्रश्न है:
select databasename
from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source)
उपरोक्त क्वेरी तीन सेकंड में पूरी होती है।
यदि उपरोक्त क्वेरी कोई भी मान लौटाती है, तो हम EXIT में संग्रहीत कार्यविधि चाहते हैं, इसलिए मैं इसे नीचे की तरह फिर से लिखता हूं:
If Exists(
select databasename
from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source)
)
Begin
Raiserror('Source missing',16,1)
Return
End
हालांकि इसमें 10 मिनट का समय लग रहा है।
मैं नीचे की तरह उपरोक्त क्वेरी फिर से लिख सकता हूं, जो 3 सेकंड से भी कम समय में पूरी होती है:
select databasename
from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source
if @@rowcount >0
Begin
Raiserror('Source missing',16,1)
Return
End
उपरोक्त पुनर्लेखन के साथ मुद्दा यह है कि उपरोक्त क्वेरी बड़ी संग्रहित प्रक्रिया का हिस्सा है और यह कई परिणाम सेट लौटाता है। C # में, हम प्रत्येक परिणाम सेट के माध्यम से पुनरावृत्ति करते हैं और कुछ प्रसंस्करण करते हैं।
उपरोक्त एक रिक्त परिणाम सेट देता है, इसलिए यदि मैं इस दृष्टिकोण के साथ जाता हूं, तो मुझे अपना सी # बदलना होगा और फिर से तैनाती करनी होगी।
तो मेरा सवाल है,
सिर्फ
IF EXISTS
इतना समय लेने की योजना में बदलाव क्यों करता है ?
नीचे विवरण दिए गए हैं जो आपकी मदद कर सकते हैं और मुझे बताएं कि क्या आपको किसी विवरण की आवश्यकता है:
- मेरी जैसी योजना बनाने के लिए तालिका और सांख्यिकी स्क्रिप्ट बनाएं
- धीमी निष्पादन योजना
तेज निष्पादन योजना
ब्रेंटोजर पेस्ट का उपयोग करके योजना को धीमा करें ब्रेंटोजर योजना का उपयोग करके
फास्ट प्लान की योजना बनाएं
नोट: दोनों प्रश्न समान हैं (मापदंडों का उपयोग करते हुए), एकमात्र अंतर यह है EXISTS
(हालांकि मैंने अज्ञात करते समय कुछ गलतियाँ की हैं)।
तालिका निर्माण स्क्रिप्ट नीचे हैं:
http://pastebin.com/CgSHeqXc - छोटी तालिका आँकड़े
http://pastebin.com/GUu9KfpS - बड़ी तालिका आँकड़े