पृष्ठभूमि
मेरे पास SQL Server 2008 R2 के खिलाफ चलने वाली एक क्वेरी है जो 12 अलग-अलग "टेबल" के साथ मिलती है और / या लेफ्ट-जॉइन करती है। डेटाबेस 50 मिलियन पंक्तियों और लगभग 300 विभिन्न तालिकाओं के साथ कई तालिकाओं के साथ काफी बड़ा है। यह एक बड़ी-ईश कंपनी के लिए है जिसके पूरे देश में 10 वेयरहाउस हैं। सभी वेयरहाउस डेटाबेस पर पढ़ते हैं और लिखते हैं। तो यह बहुत बड़ा और बहुत व्यस्त है।
जिस क्वेरी से मुझे परेशानी हो रही है वह कुछ इस तरह दिखती है:
select t1.something, t2.something, etc.
from Table1 t1
inner join Table2 t2 on t1.id = t2.t1id
left outer join (select * from table 3) t3 on t3.t1id = t1.t1id
[etc]...
where t1.something = 123
ध्यान दें कि एक जोड़ गैर-सहसंबद्ध उप-क्वेरी पर है।
समस्या यह है कि आज सुबह से, बिना किसी बदलाव के (जो कि मैं या मेरी टीम पर कोई भी जानता है) सिस्टम को, जिस क्वेरी को चलाने के लिए आमतौर पर लगभग 2 मिनट लगते हैं, उसे चलाने में एक घंटा और एक घंटा लगने लगा - जब यह बिल्कुल भागे। डेटाबेस के बाकी सिर्फ ठीक साथ गुनगुना रहा है। मैंने इस क्वेरी को स्प्रो से बाहर निकाल दिया है जो आमतौर पर इसमें चलता है और मैंने इसे एसएसएमएस w / हार्ड-कोडेड पैरामीटर चर में उसी धीमेपन के साथ चलाया है।
विचित्रता यह है कि जब मैं गैर-सहसंबद्ध उप-क्वेरी लेता हूं और इसे एक अस्थायी तालिका में फेंक देता हूं, और फिर उप-क्वेरी के बजाय इसका उपयोग करता हूं, तो क्वेरी ठीक चलती है। इसके अलावा (यह मेरे लिए सबसे अजीब है) अगर मैं क्वेरी के अंत में कोड का यह टुकड़ा जोड़ता हूं, तो क्वेरी बहुत बढ़िया चलती है:
and t.name like '%'
मैंने इन छोटे प्रयोगों से (शायद गलत तरीके से) निष्कर्ष निकाला है कि धीमे-धीमे का कारण यह है कि SQL की कैश्ड निष्पादन योजना कैसे सेट की जाती है - जब क्वेरी थोड़ी अलग होती है, तो उसे एक नई निष्पादन योजना बनानी होती है।
मेरा प्रश्न यह है: जब एक क्वेरी जो तेजी से चलती थी, वह अचानक रात के बीच में धीरे-धीरे चलने लगती है और इस एक क्वेरी के अलावा और कुछ भी प्रभावित नहीं होता है, मैं इसे कैसे परेशान करूं और इसे भविष्य में होने से कैसे बचाऊं ? मुझे कैसे पता चलेगा कि SQL इसे इतना धीमा बनाने के लिए आंतरिक रूप से क्या कर रहा है (यदि खराब क्वेरी चली, तो मैं इसकी निष्पादन योजना प्राप्त कर सकता हूं लेकिन यह नहीं चलेगा - शायद अपेक्षित निष्पादन योजना मुझे कुछ दे सकती है?)। यदि यह समस्या निष्पादन योजना के साथ है, तो मैं यह सोचकर एसक्यूएल कैसे रख सकता हूं कि वास्तव में भद्दा निष्पादन योजना एक अच्छा विचार है?
इसके अलावा, यह पैरामीटर सूँघने की समस्या नहीं है। मैंने देखा है कि पहले, और यह नहीं है, क्योंकि जब भी मैं SSMS में varaibles को हार्ड-कोड करता हूं, तब भी मुझे धीमा प्रदर्शन मिलता है।