5

मेरे पास क्वेरी है जो कुछ कॉलम पर गतिशील होने की आवश्यकता है, जिसका अर्थ है कि मुझे पैरामीटर मिलता है और इसके मूल्य के अनुसार मैं तय करता हूं कि मेरे कहां से कौन सा कॉलम लाने के लिए । मैं इस अनुरोध का उपयोग कर "मामले" अभिव्यक्ति को क्रियान्वित किया है:विभिन्न कॉलम चुनने के लिए खंड कहां "केस" का उपयोग करते हुए प्रदर्शन

(CASE @isArrivalTime WHEN 1 THEN ArrivalTime ELSE PickedupTime END) 
>= DATEADD(mi, [email protected], @sTime) 
AND (CASE @isArrivalTime WHEN 1 THEN ArrivalTime ELSE PickedupTime END) 
< DATEADD(mi, [email protected], @fTime) 

तो @isArrivalTime = 1 तो चुना ArrivalTime स्तंभ बाकी PickedupTime स्तंभ चुना है। मेरे पास ArrivalTime पर क्लस्टर इंडेक्स है और PickedupTime पर गैर-क्लस्टर इंडेक्स है।

मैंने देखा है कि जब मैं इस क्वेरी का उपयोग कर रहा हूं (@isArrivalTime = 1 के साथ), मेरा प्रदर्शन केवल ArrivalTime का उपयोग करने की तुलना में बहुत खराब है।

हो सकता है कि क्वेरी ऑप्टिमाइज़र इस तरह से इंडेक्स को सही तरीके से उपयोग नहीं कर सके?

मैंने निष्पादन योजनाओं की तुलना में एक ध्यान दिया कि जब मैं CASE का उपयोग कर रहा हूं, तो 32% समय सूचकांक स्कैन पर बर्बाद हो रहा है, लेकिन जब मैंने CASE (just used आगमन समय का उपयोग नहीं किया था) केवल 3% बर्बाद हो गए थे इस सूचकांक स्कैन पर।

किसी को इसका कारण पता है?

उत्तर

0

कोशिश दिनांक सीमा निर्धारित करने के लिए:

declare @resSTime datetime 
     ,@resFTime datetime 

set @resSTime = DATEADD(mi, [email protected], @sTime) 
set @resFTime = DATEADD(mi, [email protected], @fTime) 

और मामले को 'या'

(ArrivalTime >= @resSTime 
    and ArrivalTime < @resFTime 
    and @isArrivalTime = 1) 
or (PickedupTime >= @resSTime 
    and PickedupTime < @resFTime 
    and @isArrivalTime <> 1) 
+0

याप, कि मेरी समस्या हल हो जाती बदलने की कोशिश। धन्यवाद! –

2

2 के बीच का अंतर शायद स्कैन करने के लिए पंक्तियों की विभिन्न संख्याओं के कारण होता है। चूंकि आपकी क्वेरी संभावित रूप से अधिक तालिकाओं के बीच जुड़ने का अंतिम परिणाम है। ध्यान रखें कि एक स्कैन है .. अच्छी तरह से इसका नाम क्या है, सभी पंक्तियों का स्कैन। आप विचार बनाने के लिए पंक्तियों की अनुमानित संख्या के लिए योजना में जांच सकते हैं।

यदि आप गतिशील फ़ील्ड पर फ़िल्टर का उपयोग करते हैं (उदाहरण के लिए केस का उपयोग करके), उस फ़ील्ड पर एक इंडेक्स इंजन द्वारा उपयोग नहीं किया जा सकता है। इस तरह के मामले में आप सही एसक्यूएल का उत्पादन करने के लिए गतिशील एसक्यूएल का उपयोग करने के बेहतर हैं और exec_sql का उपयोग करें। या अगर सही चीज को सीधे पूछने के लिए कथन का उपयोग करें।

आपको गतिशील एसक्यूएल का उपयोग करने के लिए यह उपयोगी मिल सकता है, यह समझाएगा कि क्यों और कैसे।

http://www.sommarskog.se/dynamic_sql.html

संबंधित मुद्दे