मेरी अनुक्रमणिका सही पंक्तियों की संख्या और सॉर्ट ऑपरेटर का अनुमान क्यों नहीं लगा सकती?


11

मैंने एक क्वेरी का उपयोग किया है जो कि विधेय पर एक फ़ंक्शन का उपयोग करती है, कुछ इस प्रकार है:

commentType = 'EL'
AND commentDateTime >= DATEADD(month,datediff(month,0,getdate()) - 13,0)

मेरे पास कमेंटटाइप पर एक फ़िल्टर किया गया इंडेक्स है जिसमें 40K पंक्तियाँ हैं और जब मैं क्वेरी चलाता हूं, तो इंडेक्स सीक के लिए पंक्तियों की अनुमानित संख्या बहुत सटीक है (लगभग 11K), लेकिन अगले चरण (सॉर्ट ऑपरेटर) के लिए यह पूरी तरह से आँकड़ों की अनदेखी करता है। फ़िल्टर्ड इंडेक्स में कुल पंक्तियों की संख्या का अनुमान है।

ये क्यों हो रहा है? मैं sargability के बारे में मूल बातें जानता हूँ , और मैं सिर्फ एक वास्तविक तारीख (2014-01-01) और voila द्वारा dateadd की जगह विवेक की खातिर परीक्षण किया है ... तरह सही ढंग से पंक्तियों की संख्या का अनुमान लगाना शुरू कर दिया ...

यह क्यों हो रहा है और मैं इसे कैसे ठीक कर सकता हूं? मैं एक निश्चित तारीख नहीं दे सकता ...


DATEADD(month,datediff(month,0,getdate()) - 13,0)मेरे लिए कोई मतलब नहीं है। इससे आप क्या करने की कोशिश कर रहे हैं? क्या इसमें सुधार / सरलीकरण किया जा सकता है?
डैनियल हट्मैचर

2
@ डैनियल यह महीने की शुरुआत है, 13 महीने पहले।
हारून बर्ट्रेंड

1
इसके अलावा, कृपया SQL सर्वर (?) के संस्करण को दर्शाने के लिए अपने प्रश्न को संपादित करें। उसके लिए टैग का उपयोग करें।
डैनियल हतमाकर 14

क्या आप कोशिश कर सकते हैं DATEADD(month, -13, DATEADD(day, 1-DATEPART(day, SYSDATETIME()))और देख सकते हैं कि क्या कोई अंतर है?
डैनियल हतमाकर 14

यदि आपके पास एक गैर-फ़िल्टर किया गया सूचकांक है (commentType, commentDate), तो क्या यह वहां बेहतर व्यवहार करता है? यह सिर्फ इतना है कि फ़िल्टर किए गए सूचकांक कभी-कभी योजनाओं में विभिन्न बिंदुओं पर अनुमानों को गलत कर सकते हैं। फ़िल्टर किए गए इंडेक्स में कुल संख्या की रिपोर्ट करके अनुमान लगता है, लेकिन यह वास्तव में है कि योजना को गलत दिखाया जा रहा है।
रोब फार्ले

जवाबों:


9

मेरा मानना ​​है कि आपके अनुमान गलत हैं एक अनुमानकर्ता बग के कारण जो कि DatedIFF तर्क के दो स्वैप करता है। मैं इस बारे में यहां बात करता हूं:

दिनांकित (2008+) का उपयोग किए बिना 13 महीने पहले के पहले दिन की गणना करने के लिए एक समाधान है:

DATEADD(MONTH, -13, DATEADD(DAY, 1-DATEPART(DAY,GETDATE()), CONVERT(DATE, GETDATE()));

मैं सकारात्मक नहीं हूं जो अनुमान को संबोधित करेगा (मैंने फ़िल्टर्ड इंडेक्स के साथ परीक्षण नहीं किया है, और मुझे यकीन नहीं है कि वास्तव में यह क्या कर रहा है या क्यों यह योजना और / या बाकी क्वेरी के बिना एक अलग अनुमान है? )।

Microsoft तय करता है कि TF 4199 का उपयोग किया जाए, लेकिन मुझे यकीन नहीं है कि आपको यहां क्या करना होगा:

एक अन्य विकल्प यह सुनिश्चित करना होगा कि आप एसक्यूएल सर्वर के जिस भी संस्करण का उपयोग कर रहे हैं, उसके लिए आप नवीनतम नवीनतम एसपी / सीयू पर हों, क्योंकि वे दावा करते हैं कि यह निम्नलिखित केबी लेख में तय किया गया है (हालांकि इसके लिए अभी भी टीएफ 4199 के उपयोग की आवश्यकता होगी जब तक आप 2014 या बेहतर नहीं हैं):

निम्नलिखित बिल्ड के साथ फिक्स प्राप्त किया जा सकता है:

  • 2005 SP3 CU 15 (> = 9.00.4325 और <= 9.00.4999)
  • 2005 SP4 CU 2 (> = 9.00.5259)
  • 2008 SP1 CU 13 (> = 10.00.2816.00 और <= 10.00.3999)
  • 2008 SP2 CU 3 (> = 10.00.4279.00 और <= 10.00.5499)
  • 2008 के विस्तार से SP3 और SP4 (> = 10.00.5500)
  • 2008 R2 CU 7 (10.50.1777.0)
  • 2008 R2 SP1 CU 3 (> = 10.50.2769.0 और <= 10.50.3999)
  • एक्सटेंशन 2008 R2 SP2 और SP3 (> = 10.50.4000)
  • विस्तार द्वारा 2012, 2014, 2016 (> = 11.0)

(अगली बार, कृपया SELECT @@VERSIONअपने प्रश्न के परिणाम शामिल करें ।)

मैं ध्यान दूंगा कि केबी लेख कहता है कि डेटेडिफ पंक्तियों की संख्या को कम कर सकता है, जो आपके परिदृश्य में हो रहा है के विपरीत है। इसका मतलब यह नहीं है कि सुधार आप पर लागू नहीं होते हैं; मुझे लगता है कि KB लेख शब्दांकन गलत है, क्योंकि अनुमान डेटा और उस श्रेणी के आधार पर किसी भी तरह से जा सकते हैं।

ऊपर मेरे ब्लॉग पोस्ट ने पुष्टि की कि स्वैपिंग अब 2014 और उसके बाद नहीं होगी। सुरक्षित होने के लिए, मैं शायद आपके समर्पित से केवल DatedIFF को स्क्रैप करूंगा और अपनी श्रेणी की शुरुआत की गणना करने के लिए एक अलग विधि का उपयोग करूंगा। मैं खराब स्वैप को रोकने के लिए 4199 के ओवरकिल या डायनेमिक SQL का उपयोग करने का सुझाव नहीं देता।


सहायता के लिए धन्यवाद ! मैंने आपके सुझाव की कोशिश की और योजना बदल गई। यह इस तरह से पहले था: s16.postimg.org/t5j6o1yed/fix_wrong.png यह है कि यह कैसे है क्योंकि मैं तुम्हारे द्वारा मेरी datediff बदल दिया है: postimg.org/image/5x725rj83 मैं उन सभी url को पढ़ने जा रहा हूं जो आपने मुझे दिए हैं। । चीयर्स।
15
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.