मैं बस उत्सुक हूं कि एक समग्र क्वेरी GROUP BY
बिना किसी खंड के इतनी तेजी से क्यों चलती है ।
उदाहरण के लिए, इस क्वेरी को चलने में लगभग 10 सेकंड लगते हैं
SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
जबकि यह एक सेकंड से भी कम समय लेता है
SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
GROUP BY CreatedDate
CreatedDate
इस मामले में केवल एक ही है , इसलिए समूहीकृत क्वेरी उसी परिणाम को लौटाती है जैसे कि एक अनग्रुप्ड।
मैंने देखा कि दो प्रश्नों के लिए निष्पादन योजनाएं अलग हैं - दूसरी क्वेरी समानांतरवाद का उपयोग करती है जबकि पहली क्वेरी नहीं करती है।
यह SQL सर्वर के लिए एक समग्र क्वेरी का मूल्यांकन करने के लिए सामान्य है अगर यह एक समूह द्वारा खंड नहीं है? और क्या ऐसा कुछ है जो मैं GROUP BY
क्लॉज का उपयोग किए बिना 1 क्वेरी के प्रदर्शन को बेहतर बनाने के लिए कर सकता हूं ?
संपादित करें
मैंने अभी सीखा कि मैं OPTION(querytraceon 8649)
समानांतरवाद की लागत उपरि को 0 पर सेट करने के लिए उपयोग कर सकता हूं , जो क्वेरी को कुछ समानता का उपयोग करता है और रनटाइम को 2 सेकंड तक कम कर देता है, हालांकि मुझे नहीं पता कि इस क्वेरी संकेत का उपयोग करने के लिए कोई डाउनसाइड है या नहीं।
SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
OPTION(querytraceon 8649)
मैं अभी भी एक छोटे रनटाइम को पसंद करूंगा क्योंकि क्वेरी उपयोगकर्ता चयन पर एक मूल्य को पॉप्युलेट करने के लिए है, इसलिए आदर्श रूप से तत्काल होना चाहिए जैसे समूह क्वेरी है। अभी मैं सिर्फ अपनी क्वेरी लपेट रहा हूं, लेकिन मुझे पता है कि यह वास्तव में एक आदर्श समाधान नहीं है।
SELECT Min(CreatedDate)
FROM
(
SELECT Min(CreatedDate) as CreatedDate
FROM MyTable WITH (NOLOCK)
WHERE SomeIndexedValue = 1
GROUP BY CreatedDate
) as T
# 2 संपादित करें
अधिक जानकारी के लिए मार्टिन के अनुरोध के जवाब में :
दोनों CreatedDate
और SomeIndexedValue
उन पर एक अलग गैर-अद्वितीय, गैर-संकुल सूचकांक है। SomeIndexedValue
वास्तव में एक varchar (7) फ़ील्ड है, भले ही यह एक संख्यात्मक मान संग्रहीत करता है जो किसी अन्य तालिका के PK (int) को इंगित करता है। डेटाबेस में दो तालिकाओं के बीच संबंध परिभाषित नहीं है। मैं डेटाबेस को बिल्कुल भी बदलने वाला नहीं हूँ, और केवल क्वेरीज़ लिख सकता हूँ जो डेटा को क्वेरी करता है।
MyTable
3 मिलियन से अधिक रिकॉर्ड शामिल हैं, और प्रत्येक रिकॉर्ड को एक समूह सौंपा गया है जो इसका ( SomeIndexedValue
) है। समूह 1 से 200,000 रिकॉर्ड से कहीं भी हो सकते हैं
MAXDOP
समानांतरता की अधिकतम डिग्री सेट करता है, जो क्वेरी का उपयोग करने वाले प्रोसेसर की संख्या को सीमित कर रहा है। यह मूल रूप से 2 क्वेरी को 1 के रूप में धीमी गति से चलाता है, क्योंकि यह समानांतरता का उपयोग करने की क्षमताओं को हटा रहा है, जो कि मैं नहीं चाहता।