2012-10-23 13 views
7

मेरे पास शानदार डालने प्रदर्शन के साथ समय-श्रृंखला डेटा की एक अरब से अधिक पंक्तियों की एक तालिका है लेकिन (कभी-कभी) भयानक चयन प्रदर्शन।एसक्यूएल सर्वर: टाइम-सीरीज डेटा प्रदर्शन

टेबल tblTrendDetails (पी दिखाया गया है का आदेश दिया है):

PK TrendTime datetime 
PK CavityId  int 
PK TrendValueId int 
    TrendValue real 

तालिका लगातार नए डेटा में खींच रहा है और पुराने डेटा के शुद्धिकरण, इसलिए डालने और हटाने के प्रदर्शन तेज़ रहने के लिए की जरूरत है।

SELECT * 
FROM tblTrendDetails 
WHERE TrendTime BETWEEN @inMinTime AND @inMaxTime 
    AND CavityId = @inCavityId 
    AND TrendValueId = @inTrendId 

अगर मैं एक ही क्वेरी फिर से अमल (समान समय के साथ, लेकिन किसी भी @inCavityId या @inTrendId), प्रदर्शन बहुत है:

जब जैसे कि निम्न एक प्रश्न को क्रियान्वित करने, प्रदर्शन (30 सेकंड) गरीब है अच्छा (1 सेकंड)। प्रदर्शन काउंटर दिखाते हैं कि डिस्क एक्सेस पहली बार क्वेरी चलाने पर अपराधी है।

प्रदर्शन के बिना किसी भी सुधार (प्रदर्शन) को सुधारने या प्रदर्शन को हटाने पर प्रतिकूल प्रभाव डालने के बारे में कोई सिफारिशें? कोई सुझाव (अंतर्निहित डेटाबेस को पूरी तरह से बदलकर) का स्वागत है।

+1

पीके क्लस्टर किया गया है? कोई अनुक्रमणिका? –

+1

@TimLehner हाँ .. पीके क्लस्टर किया गया है। नहीं (अन्य) अनुक्रमणिका। – pilotcam

उत्तर

6

तथ्य यह है कि समान या समान डेटा के बाद के प्रश्न बहुत तेजी से चलते हैं शायद SQL सर्वर caching your data के कारण होता है। उस ने कहा, क्या इस प्रारंभिक क्वेरी को गति देना संभव है?

क्वेरी योजना की पुष्टि करें:

मेरा अनुमान है कि आपकी क्वेरी परिणाम चाहिए में एक सूचकांक सूचकांक स्कैन के बजाय शोध (या बुरा, एक टेबल स्कैन) है। कृपया SET SHOWPLAN_TEXT ON; या इसी तरह की सुविधा का उपयोग करके इसे सत्यापित करें। between और = का उपयोग करके आपकी क्वेरी वास्तव में take advantage of the clustered index होनी चाहिए, हालांकि that's debatable

सूचकांक विखंडन:

यह संभव है कि अपने संकुल अनुक्रमणिका (इस मामले में प्राथमिक कुंजी) उन आवेषण के सब के बाद काफी खंडित है और हटा देता है। मैं शायद इसे DBCC SHOWCONTIG (tblTrendDetails) के साथ जांचूँगा।

आप तालिका के सूचकांक को DBCC INDEXDEFRAG (MyDatabase, tblTrendDetails) से डिफ्रैग कर सकते हैं। इसमें कुछ समय लग सकता है, लेकिन तालिका को सुलभ रहने की अनुमति होगी, और आप बिना किसी दुष्प्रभाव के ऑपरेशन को रोक सकते हैं।

आपको आगे जाना और DBCC DBREINDEX (tblTrendDetails) का उपयोग करना पड़ सकता है। यह एक ऑफ़लाइन ऑपरेशन है, हालांकि, आपको केवल तभी ऐसा करना चाहिए जब तालिका को एक्सेस करने की आवश्यकता न हो।

यहां वर्णित कुछ अंतर हैं: Microsoft SQL Server 2000 Index Defragmentation Best Practices

ध्यान रखें कि आपका लेनदेन लॉग बड़ी तालिका को डिफ्रैग करने से थोड़ा सा बढ़ सकता है, और इसमें काफी समय लग सकता है।

विभाजन दृश्य:

इन स्थिति में सुधार नहीं है (या विखंडन एक समस्या नहीं है), तो आप भी, partitioned views को देखने के लिए इच्छा हो सकती है जिसमें आप विभिन्न के लिए अंतर्निहित आधार तालिकाओं का एक समूह बनाने के रिकॉर्ड्स की श्रेणियां, फिर उन्हें एक दृश्य में जोड़ दें (अपनी मूल तालिका को बदल दें)।

बेहतर सामग्री:

यदि इन चयन के प्रदर्शन एक वास्तविक व्यापार की जरूरत है, तो आप बेहतर हार्डवेयर के लिए मामला बनाने के लिए सक्षम हो सकता है: तेजी से ड्राइव, अधिक स्मृति, आदि अपने ड्राइव दो बार के रूप कर रहे हैं तेज़, तो यह प्रश्न आधे समय में चलेगा, हाँ? साथ ही, यह आपके लिए व्यावहारिक नहीं हो सकता है, लेकिन मुझे बस अधिक विकल्प और बेहतर बनाए रखने के लिए बेहतर होने के लिए SQL सर्वर के नए संस्करण मिल गए हैं। मुझे खुशी है कि मेरी अधिकांश कंपनी का डेटा 2008R2 में स्थानांतरित हो गया है। लेकिन मैं digress ...

+2

+1 बहुत गहन और अच्छी तरह से उत्तर देने के लिए +1। मैं प्रश्न पोस्ट करने से पहले पूछताछ योजना सत्यापित करने के माध्यम से प्राप्त किया था। लेकिन मैंने इंडेक्स विखंडन के बारे में नहीं सोचा था। 'SHOWCONTIG' निश्चित रूप से विखंडन का खुलासा किया। मैं अब 'INDEXDEFRAG' चला रहा हूं। – pilotcam

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