के साथ प्रयुक्त "OR" खंड के उपयोग को अनुकूलित करने के लिए कैसे करें मुझे आश्चर्य है कि निम्न क्वेरी को फिर से लिखने का कोई बुद्धिमान तरीका है ताकि स्तंभों पर अनुक्रमणिका ऑप्टिमाइज़र द्वारा उपयोग की जाए?पैरामीटर (SQL सर्वर 2008)
Create Procedure select_Proc1
@Key1 int=0,
@Key2 int=0
As
BEGIN
Select key3
From Or_Table
Where (@key1 =0 OR Key1 [email protected]) AND
(@key2 =0 OR Key2 [email protected])
END
GO
हालांकि कहां खंड में स्तंभों अनुक्रमित के अंतर्गत आते हैं, एसक्यूएल सर्वर इन अनुक्रमित उपयोग करने में असमर्थ है। यह सवाल उठाता है कि क्या कुछ भी इंडेक्स के उपयोग को अवरुद्ध कर रहा है या नहीं। इस सवाल का जवाब हां है - अपराधी पैरामीटर और "OR" स्थिति हैं। पैरामीटर इंडेक्स द्वारा कवर नहीं होते हैं, जिसका अर्थ है कि SQL सर्वर किसी भी इंडेक्स का उपयोग "@ key1 = 0" (एक शर्त जो @ key2 = 0 पर भी लागू होता है) का मूल्यांकन करने के लिए नहीं कर सकता है। प्रभावी रूप से, इसका मतलब है कि SQL सर्वर खंड "@ key1 = 0 या key1 = @ key1" का मूल्यांकन करने के लिए इंडेक्स का उपयोग नहीं कर सकता है (जैसा कि "OR" खंड दोनों स्थितियों से कवर पंक्तियों का संघ है)। वही सिद्धांत अन्य खंड (पुनः कुंजी 2) पर भी लागू होता है। इससे SQL सर्वर को यह निष्कर्ष निकाला जा सकता है कि पंक्तियों को निकालने के लिए कोई अनुक्रमणिका का उपयोग नहीं किया जा सकता है, जिससे SQL सर्वर को अगले सर्वोत्तम दृष्टिकोण का उपयोग करने के लिए छोड़ दिया जा सकता है - क्लस्टरर्ड इंडेक्स स्कैन
जैसा कि आप देखते हैं, SQL अनुकूलक कॉलम पर अनुक्रमणिका का उपयोग नहीं करेगा यदि भविष्यवाणियां WHERE खंड में "OR" ed हैं। इस समस्या का एक समाधान, पैरामीटर के सभी संभावित संयोजन के लिए IF खंड के साथ प्रश्नों को अलग करना है।
कृपया समस्या का एक बेहतर दृश्य प्राप्त करने इस छोटे से लेख पढ़ें: http://www.sql-server-performance.com/articles/per/optimize_or_clause_p1.aspx
अब मेरे सवाल है, हमें क्या करना चाहिए संभावित संयोजन हैं, तो अधिक है कि बस तीन या चार? प्रत्येक संयोजन के लिए एक अलग क्वेरी लिखना एक तर्कसंगत समाधान प्रतीत नहीं होता है। क्या इस समस्या के लिए कोई और कामकाज है?
दिलचस्प दृष्टिकोण, मुझे लगता है कि याद रखना होगा। मुझे लगता है कि यह अन्य आरडीबीएमएस जैसे ओरेकल पर भी लागू होगा, जहां 'OR' बहुत अक्षम है। – Lucero
क्या यह एकमात्र तरीका है? क्या होगा यदि क्वेरी अधिक जटिल है (अधिक या खंड शामिल हैं) – Meysam