इस तरह के काम करने का लालच न करें:
Select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'
यह एक बेहतर तरीका है:
Select * from [User] U
where U.DateCreated >= '2014-02-07' and U.DateCreated < dateadd(day,1,'2014-02-07')
देखें:"SARGable" शब्द का वास्तव में क्या अर्थ है?
संपादित करें + डेटा पर फ़ंक्शन के उपयोग से बचने के लिए जहां क्लॉज (या शामिल होने की स्थिति में) 2 मूलभूत कारण हैं।
- ज्यादातर मामलों में फ़िल्टर करने या शामिल होने के लिए डेटा पर फ़ंक्शन का उपयोग करने से उस फ़ील्ड पर किसी इंडेक्स तक पहुंचने के लिए ऑप्टिमाइज़र की क्षमता समाप्त हो जाती है, जिससे क्वेरी धीमी (या अधिक "महंगी") हो जाती है
- दूसरा, शामिल डेटा की प्रत्येक पंक्ति के लिए कम से कम एक गणना की जा रही है। यह क्वेरी में सैकड़ों, हजारों या कई लाखों गणना जोड़ सकता है ताकि हम
2014-02-07
जैसे एकल मानदंड से तुलना कर सकें . इसके बजाय डेटा के अनुरूप मानदंडों को बदलना कहीं अधिक कुशल है।
"डेटा के अनुरूप मानदंड में संशोधन करना" मेरा वर्णन करने का तरीका है "SARGABLE
का उपयोग करें" विधेय"
और दोनों के बीच प्रयोग न करें।
<ब्लॉकक्वॉट>दिनांक और समय सीमाओं के साथ सबसे अच्छा अभ्यास बीच से बचना है और हमेशा फ़ॉर्म का उपयोग करना है:
जहां col>='20120101' और col <'20120201' यह फ़ॉर्म सभी प्रकारों और सभी सटीकताओं के साथ काम करता है, भले ही समय भाग लागू हो।
http://sqlmag.com/t-sql/t-sql-best-practices-part-2 (इत्ज़िक बेन-गण)