2012-11-21 16 views
7

से पहले सॉर्ट करें मुझे अपने SQL सर्वर 2005 डेटाबेस में प्रदर्शन ऑर्डर करने में कोई समस्या है। चलें कहते हैं कि मैं निम्नलिखित प्रश्न हैं:एसक्यूएल सर्वर 2005 पूर्ण तालिका कर रहा है इंडेक्स स्कैन

select 
    id, versionId, orderIndex 
from Forms_Page 
where 
    versionId = 'AFCF4921-31B4-44C1-B3A7-913910F7600E' 
order by 
    orderIndex 

इस क्वेरी 7 पंक्तियों को वापस और 23 सेकंड का समय ~ निष्पादित करने के लिए होगा। इस क्वेरी की निष्पादन योजना निम्नानुसार है (अभी तक छवियां पोस्ट नहीं कर सकती है):

चयन करें (लागत: 0%) -> क्रमबद्ध करें (लागत: 11%) -> क्लस्टरर्ड इंडेक्स स्कैन (लागत: 89%)

अगर मैं 'ऑर्डर बाय' क्लॉज को हटा देता हूं, तो क्वेरी अपेक्षित की तरह ~ 4 एमएस में पूरी हो जाएगी।

अनुरोधित पंक्तियां प्राप्त करने से पहले SQL सर्वर एक प्रकार क्यों कर रहा है? यह मुझे समझ में नहीं आता है। क्यों पहली बार 7 पंक्तियां नहीं मिल रही हैं और केवल उनको छंटाई है? क्या मुझे डेटाबेस कॉन्फ़िगरेशन की तरह कुछ याद आ रहा है, या यह एक अपेक्षित व्यवहार है?

मैं नीचे की तरह एक आंतरिक चयन का उपयोग कर सकता हूं, ताकि इंजन को पंक्तियों को पहले और फिर ऑर्डर प्राप्त करने के लिए मजबूर किया जा सके, जो पंक्तियों को ~ 6 एमएस में वापस कर देगा, लेकिन चूंकि हम ईएफ का उपयोग कर रहे हैं, यह नहीं होगा हमारे लिए एक अच्छा समाधान (हम परिणामों को स्मृति में सॉर्ट कर सकते हैं, लेकिन हम कुछ इकाइयों के लिए लोडविथ विकल्प का उपयोग कर रहे हैं जो एसक्यूएल कोड उत्पन्न करते हैं, और वह कोड भी 'ऑर्डर बाय' समस्या से पीड़ित है)।

select * 
from(
    select 
     id, versionId, orderIndex 
    from Forms_Page 
    where 
     versionId = 'AFCF4921-31B4-44C1-B3A7-913910F7600E' 
) T 
order by 
    T.orderIndex 

मैंने परीक्षण किया है कुछ इंडेक्सिंग सॉर्ट किए गए कॉलम हैं, जो चीजों को तेज करते हैं, लेकिन केवल इसलिए कि कॉलम पहले ही सॉर्ट किए गए हैं। एक गुंजाइश समाधान की तरह लगता है ...

+0

क्लस्टर सूचकांक स्कैन कदम के आदेश -> क्रमबद्ध करें -> का चयन करें। जो आप देखते हैं उसे चुनें अंतिम चरण है, जो वास्तव में अपेक्षित आउटपुट देता है। (और आउटपुट को सॉर्ट किया जाना चाहिए) और योजना में "बड़ा कार्य" अनुमानित सूचकांक स्कैन है और सॉर्ट नहीं है। क्या आप निश्चित हैं कि निष्पादन योजना द्वारा आदेश के बिना स्कैन करने के लिए एक ही अनुक्रमणिका का उपयोग किया जाता है? –

+0

हां, यह एक ही इंडेक्स का उपयोग करता है क्योंकि यह कुछ मैंने महसूस किया है, अब आपने जो कुछ बताया है, वह यह है कि एक साधारण खोज के लिए यह स्ट्रिंग को एक अद्वितीय पहचानकर्ता को बदलने के लिए IMPLICIT_CONVERT का उपयोग करता है, जबकि इसे {guid, 'AFCF4921- 31B4-44C1-B3A7-913910F7600E '}। मैंने कुछ परीक्षण किए और परिवर्तनों के साथ कुछ परीक्षण किए और मैं एक ही समय प्राप्त कर रहा हूं। –

+0

संस्करण एक अद्वितीय कुंजी है? या आप डुप्लिकेट कर सकते हैं? यदि यह अद्वितीय है तो मैं उम्मीद करता हूं कि यह बहुत तेज हो। –

उत्तर

1

सबसे पहले, मुझे नहीं पता कि यह क्यों कर रहा है! ऐसा कहकर, यहां कुछ ऐसी चीजें हैं जिन्हें आपने संभवतः पहले ही कोशिश की है।

  • क्वेरी संकेत: आप यहाँ प्रलेखित विभिन्न प्रकार की क्वेरी संकेत के किसी भी उपयोग की कोशिश की? http://msdn.microsoft.com/en-us/library/ms181714.aspx। विशेष रूप से RECOMPILE विकल्प।

  • DBCC FREEPROCCACHE और DBCC DROPCLEANBUFFERS के सामान्य चरणों के बारे में क्या? ये वे चीजें हैं जिन्हें मैं आम तौर पर कोशिश करता हूं।

  • अद्यतन आंकड़े: या तो संपूर्ण डेटाबेस के आंकड़े अपडेट करने के लिए UPDATE STATISTICS tablename या EXEC sp_updatestats चलाकर या तो।

अंत में, और शायद अपने मामले में प्रासंगिक नहीं है, लेकिन वहाँ मेज की एक अच्छी व्याख्या दी गई है यहाँ संकेत: http://blog.sqlauthority.com/2009/11/19/sql-server-understanding-table-hints-with-examples/

+0

अफसोस की बात है कि उनमें से कोई भी काम नहीं करता है और यहां तक ​​कि एचआईएनटीएस के साथ भी, मुझे नहीं लगता कि एंटिटी फ्रेमवर्क को उनको उपयोग करने के लिए कहना संभव है, जहां तक ​​मुझे पता है। –

+0

यह बेहद अजीब है! मैं बस EXEC sp_updatestats को दोबारा शुरू करता हूं और यह ठीक काम नहीं करता है। यह अजीब बात है कि यह पहली बार काम नहीं किया! लेकिन अब यह क्या मायने रखता है! सहायता के लिए धन्यवाद! –

+0

यह विचित्र है, लेकिन यह अच्छा है कि अंत में यह ठीक से काम करता है। यदि आंकड़े पहली बार काम नहीं करते हैं तो मैं आंकड़ों को दो बार अपडेट करने के लिए एक नोट बनाउंगा ;-) –

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