2010-11-22 15 views
9

में क्वेरी प्रदर्शन के लिए विभाजन मेरे पास एक परिदृश्य है जिसमें किसी आइटम के बारे में स्थिति डेटा की एक बड़ी मात्रा है। आइटम की स्थिति मिनट से मिनट तक अपडेट की जाती है, और निकट भविष्य में लगभग 50,000 आइटम होंगे। इसलिए, एक महीने में, डेटा की लगभग 2,232,000,000 पंक्तियां होंगी। पुराने डेटा को प्राप्त करने से पहले, मुझे मुख्य तालिका में कम से कम 3 महीने रखना चाहिए।SQL सर्वर 2008

मुझे एक विशिष्ट आइटम (इसकी आईडी) और डेटा रेंज (आमतौर पर, एक महीने की सीमा तक) के आधार पर त्वरित प्रश्न प्राप्त करने की योजना बनाना चाहिए - उदा। तालिका से ए, बी, सी का चयन करें जहां आइटम आईडी = 3000 और '2010-10-01' और '2010-10-31 23: 59: 59.9 99'

तो मेरा प्रश्न यह है कि विभाजन विभाजन को कैसे डिजाइन किया जाए वह प्राप्त करें?

वर्तमान में, मैं "आइटम के अद्वितीय पहचानकर्ता" (एक int) मोड "विभाजन की संख्या" पर आधारित विभाजन कर रहा हूं, ताकि सभी विभाजन समान रूप से वितरित किए जा सकें। लेकिन विभाजन विभाजन में विभाजन कॉलम के रूप में कार्य करने के लिए तालिका में एक अतिरिक्त कॉलम रखने की कमी है, इसलिए, पंक्ति को इसके विभाजन में मैप करना। जो कुछ अतिरिक्त भंडारण जोड़ते हैं। साथ ही, प्रत्येक विभाजन को एक अलग फ़ाइल समूह में मैप किया जाता है।

+1

यह कुछ लोड है। उच्च मात्रा लिखने के बारे में [यहां] (http://sqlblog.com/blogs/paul_nielsen/archive/2007/12/12/10-lessons-from-35k-tps.aspx) पढ़ें (आपके पास 50k पंक्तियां * प्रति है दूसरा * आने वाला)। मैं चिंतित हूं कि आप इसे कैसे हल करेंगे: मुझे उस मात्रा/वृद्धि की दर का कोई अनुभव नहीं है) – gbn

+0

पर क्या आप लिखने की क्वेरी दक्षता के लिए डिज़ाइन करने की कोशिश कर रहे हैं या क्वेरी दक्षता पढ़ रहे हैं? आपके पास किस तरह के पढ़ने के भार हैं? –

+0

क्या आप हमें कुछ और जानकारी दे सकते हैं कि तालिका में कौन से कॉलम हैं और क्वेरी में कौन से कॉलम आकार (चौड़ाई) हैं? –

उत्तर

10

क्वेरी प्रदर्शन के लिए विभाजन कभी नहीं किया जाता है। प्रदर्शन के साथ प्रदर्शन हमेशा खराब हो जाएगा, सबसे अच्छा आप उम्मीद कर सकते हैं कि कोई बड़ी प्रतिगमन नहीं है, लेकिन कभी सुधार नहीं होता है।

क्वेरी प्रदर्शन के लिए, कोई भी विभाजन कर सकता है, और सूचकांक बेहतर कर सकता है, और यह आपका उत्तर होना चाहिए: सूचकांक उचित रूप से।

विभाजन आईओ पथ नियंत्रण मामलों (संग्रह/वर्तमान खंडों पर वितरित) या ईटीएल लोड में तेजी से स्विच-इन स्विच-आउट परिदृश्यों के लिए उपयोगी है। इसलिए मैं समझूंगा कि क्या आपके पास एक स्लाइडिंग विंडो और विभाजन तिथि है ताकि आप उस डेटा को तुरंत बदल सकें जिसे अब बनाए रखने के लिए आवश्यक नहीं है।

विभाजन के लिए एक और संकीर्ण मामला अंतिम पृष्ठ डालने वाला लच विवाद है, जैसा कि Resolving PAGELATCH Contention on Highly Concurrent INSERT Workloads में वर्णित है।

आपकी विभाजन योजना और उपयोग केस किसी भी परिदृश्य में फिट नहीं लग रहा है जिसमें यह लाभ होगा (शायद अंतिम परिदृश्य है, लेकिन विवरण से स्पष्ट नहीं है), इसलिए संभवतः यह प्रदर्शन को नुकसान पहुंचाता है।

+0

मैंने इस विभाजित तालिका समाधान की तुलना किसी अन्य तालिका से की थी जो विभाजन नहीं किया गया था और परिणाम विभाजित समाधान (98ms बनाम 99ms) पर थोड़ा खराब थे, मैंने 8 विभाजन का उपयोग किया है, अब, मैं इसके बजाय 250 का उपयोग करने की कोशिश करूंगा 2 ड्राइव में, और देखें कि चीजें कैसे खेलेंगी। – gsb

+0

पोको - दो (2) ड्राइव, उत्पादन प्रणाली में केवल दो ड्राइव होने जा रहे हैं? –

0

मैं रीमस से सहमत हूं, विभाजन आपके चीजों को बेहतर बनाने के लिए नहीं जा रहा है, जैसा कि आपके स्वयं के परिणाम दिखाते हैं।

विभाजन को भूलें, आईडी और दिनांक दोनों को इंडेक्स करें, और विशाल रैम वाले बॉक्स पर चलाएं; परिणाम क्या हैं?

1

मैं वास्तव में Remus Rusanu से सहमत नहीं हूं। मुझे लगता है कि यदि तर्कसंगत कारण है (आपके उपयोग के मामलों से संबंधित) तो विभाजन प्रदर्शन में सुधार कर सकता है। मेरा अनुमान है कि आप केवल आइटम आईडी पर विभाजन कर सकते हैं। विकल्प तिथि का भी उपयोग करना होगा, लेकिन यदि आप भविष्यवाणी नहीं कर सकते कि दिनांक सीमा किसी दिए गए विभाजन की सीमाओं को पार नहीं करेगी (कोई प्रश्न एक महीने के साथ होने के लिए निश्चित नहीं है), तो मैं आइटम विभाजन के साथ चिपकेगा।

यदि केवल कुछ आइटम हैं जिन्हें आप गणना करने की आवश्यकता है, तो दूसरा विकल्प एक कवर इंडेक्स होना है: एक इंडेक्स को मुख्य भेदभाव क्षेत्र (आइटम आईडी) पर परिभाषित करें जिसमें गणना करने के लिए आवश्यक फ़ील्ड शामिल हैं।

CREATE INDEX idxTest ON itemId INCLUDE quantity; 
1

अनुप्रयोगी विभाजन वास्तव में क्वेरी प्रदर्शन के लिए फायदेमंद हो सकता है। आपके मामले में आपके पास 50 के आइटम और 2 जी पंक्तियां हैं। उदाहरण के लिए आप 500 टेबल बना सकते हैं, प्रत्येक नाम status_nnn जहां nnn 001 और 500 के बीच है और इन तालिकाओं में आपके आइटम की स्थिति समान रूप से "विभाजन" करता है, जहां nnn आइटम आईडी का फ़ंक्शन है। इस तरह, एक आइटम आईडी दिया गया है, आप अपनी खोज को संपूर्ण डेटा (सीए 4 एम पंक्तियों) के 0.2% तक प्राथमिकता सीमित कर सकते हैं।

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

अनिवार्य रूप से आवेदक विभाजन एक बहुत व्यापक और फ्लैट इंडेक्स बनाने के समान है, जो डेटा को डुप्लिकेट करने के लिए बहुत विशिष्ट प्रश्नों के लिए अनुकूलित है।

आवेदक विभाजन का एक अन्य लाभ यह है कि आप सिद्धांत में (आपके उपयोग के मामले के आधार पर) विभिन्न डेटा और यहां तक ​​कि विभिन्न सर्वरों के बीच अपना डेटा वितरित कर सकते हैं। दोबारा, यह आपकी विशिष्ट आवश्यकताओं पर बहुत निर्भर करता है, लेकिन मैंने विशाल डेटा सेट (पंक्तियों के अरबों) के साथ देखा और काम किया है जहां आवेदक विभाजन बहुत अच्छी तरह से काम करता है।