2013-01-24 23 views
8

मेरे पास कई दिन परिवर्तनीय हैं जिन्हें मैं डेटाटाइम कॉलम (प्रेषण) के विरुद्ध तुलना करना चाहता हूं।डेटीफ प्रदर्शन

इम वर्तमान में यह कर:

DECLARE @RunDate datetime = '2013-01-01' 
DECALRE @CalculationInterval int = 10 

DELETE 
FROM TableA 
WHERE datediff(dd, senddate, @RunDate) > @CalculationInterval 

तो मूल रूप से कुछ भी है कि पुराने तो 10 दिनों के नष्ट कर दिया जाना चाहिए, हम sendDate स्तंभ पर सूचकांक है, लेकिन अभी भी गति बहुत धीमी है, मुझे पता है बाईं ओर नहीं करना चाहिए प्रदर्शन कारणों के लिए गणना है, लेकिन इस मुद्दे को हल करने का सबसे अच्छा तरीका क्या है?

+0

मैं उस मामले में "SARGable" क्वेरी कैसे बना सकता हूं? –

उत्तर

12

अभिव्यक्ति

WHERE datediff(dd, senddate, @RunDate) > @CalculationInterval 

नहीं एक सूचकांक senddate स्तंभ पर आदेश में senddate

पर एलएचएस पर समारोह की वजह से उपयोग करने के लिए WHERE खंड बनाने के लिए सक्षम हो जाएगा 'SARGable' (यानी एक सूचकांक उपयोग करने में सक्षम), बराबर हालत के लिए बदलने के लिए:

WHERE senddate < dateadd(dd, [email protected], @RunDate) 

[धन्यवाद @Krystian Lieber को, incorr ओर इशारा करते हुए के लिए ect स्थिति]।

+0

+1 sargable – WKordos

+1

के लिए मुझे लगता है कि हालत किया जाना चाहिए जहां senddate DATEADD (दिन, @CalculationInterval, @RunDate) के लिए @ RunDate = '2013-01-11' और @ गणना इंटरवल = 10 हम प्रेषण> '2013-01-21' के साथ सभी पंक्तियों को हटाते हैं, जब मुझे लगता है कि हम प्रेषण <'2013-01-01' –

+0

@ क्रिस्टियन लाइबर के साथ सभी पंक्तियां हटाना चाहते हैं - सही है कि मैंने अपने अंत में उस बदलाव को पहले से ही बनाया है, बस इसे समझने के बारे में एक विचार प्राप्त करना चाहता था :) –