एसक्यूएल बड़ी टेबल डिजाइन


17

मेरे पास SQL ​​Server 2008 तालिका (डिज़ाइन) के बारे में एक सामान्य प्रश्न है। वर्तमान में हमारे पास एक टेबल है जो 600GB से अधिक है और एक दिन में लगभग 3GB बढ़ता है। इस तालिका में उपयुक्त अनिर्णय हैं, लेकिन प्रश्नों को चलाने और इसके आकार के कारण ही यह एक बड़ा हैंगअप बन गया है। सवाल यह है कि मुझे वर्ष और महीने तक तालिका को कई तालिकाओं में विभाजित करना चाहिए (यह फिट होगा कि अन्य विभाग अपने बड़े डेटा सेट को कैसे विभाजित करते हैं) या क्या हमें उस विभाजन का लाभ उठाना चाहिए जो SQL सर्वर में बनाया गया है। ऐसा प्रतीत होता है कि विभाजन का उपयोग करते हुए कम कोड परिवर्तन की आवश्यकता होगी। जब आप अभी भी विभाजन करते हैं तो मैंने जो पढ़ा है उसमें से केवल एक तालिका को क्वेरी करें और सर्वर हैंडल करता है कि डेटा कैसे प्राप्त करें। यदि हम कई टेबल रूट पर गए हैं, तो हमें कई टेबल से डेटा खींचना होगा।


1
क्या कोई अनुकूलन किया जाना है: बहुत विस्तृत डेटाटिप्स, अतिव्यापी या अप्रयुक्त अनुक्रमित, आदि?
gbn

संभवतः, मैंने अभी तक अन्य अनुकूलन के लिए अनिर्णय से अतीत नहीं देखा है। क्या आपके पास सिफारिशें हैं?
हंटरएक्स 3

जवाबों:


11

"इस तालिका में उपयुक्त अनिर्णय हैं, लेकिन क्वेरी चलाते समय एक बड़ा हैंगअप बन रहा है"

जब तक SQL सर्वर किसी क्वेरी को चलाते हुए विभाजनों को समाप्त करने में सक्षम नहीं होता है, तब तक केवल विभाजन प्रदर्शन क्वेरी में मदद नहीं करता है। आपके विभाजन का तरीका आपके विभाजन के तरीके के अनुरूप होना चाहिए। हमें विभाजन क्षेत्र के रूप में उपयोग करने के लिए केवल एक फ़ील्ड मिलता है, इसलिए यदि वह फ़ील्ड आपके WHERE क्लॉज़ में शामिल नहीं है, तो आपके पास विभाजन होने के बावजूद पूरी तालिका को स्कैन करने की संभावना है।

"और सिर्फ इसके आकार के कारण।"

विभाजन कुछ रखरखाव कार्यों को आसान बना सकता है, लेकिन अभी भी कुछ चीजें हैं जो हम विभाजन-दर-विभाजन के आधार पर नहीं कर सकते हैं। यदि इंडेक्स मेंटेनेंस और स्टैटस अपडेट आपको समस्याएं पैदा कर रहे हैं, तो आप डिज़ाइन को आर्काइव टेबल और लाइव-अपडेटेड टेबल में विभाजित करना बेहतर समझते हैं। जब आपको समय-समय पर डेटा को लाइव टेबल से संग्रह तालिका में स्थानांतरित करने की आवश्यकता होती है, तो आप ऐसा करते हैं, 100% भरण कारक के साथ अनुक्रमणिका को फिर से बनाते हैं, पूर्ण स्कैन के साथ आँकड़े अपडेट करते हैं, और फिर इसकी फाइलग्रुप को केवल पढ़ने के लिए सेट करते हैं। विभाजन तालिका भार के साथ मदद कर सकती है - लेकिन लाइव तालिका का विभाजन नहीं हो सकता है। (मैं यहां कई उन्नत अवधारणाओं को टॉस कर रहा हूं जैसे कि यह त्वरित और सरल है, लेकिन मैं यहां कुछ पृष्ठभूमि के बारे में बता रहा हूं)

"ऐसा प्रतीत होता है कि विभाजन का उपयोग करते हुए कम कोड परिवर्तन की आवश्यकता होगी।"

Sorta थोड़े - यह पहली नज़र में इस तरह दिखता है, लेकिन जितना अधिक आप इसे प्राप्त करते हैं, आपको विभाजन विचारों जैसे विकल्प मिलते हैं। आप मौजूदा तालिका का नाम बदल सकते हैं, इसके स्थान पर एक दृश्य में रख सकते हैं, और फिर आप अपने ऐप को बदले बिना अंतर्निहित तालिकाओं में अपने परिवर्तन कर सकते हैं (और कई तालिकाओं को जोड़ सकते हैं)।

मैंने यहाँ विभाजन के नुकसान के बारे में अधिक लिखा है:

http://www.brentozar.com/archive/2008/06/sql-server-partitioning-not-the-answer-to-everything/


3
उस लेख का पसंदीदा उद्धरण निश्चित रूप से है "विभाजन कार्यों और योजनाओं को गलत तरीके से डिजाइन करना आसान है।"
मार्क स्टोरी-स्मिथ

7

अलगाव में विभाजन पर्याप्त हो सकता है लेकिन आप विभाजन के विचारों और कई तालिकाओं के साथ संयोजन करके बेहतर परिणाम प्राप्त कर सकते हैं। यह बहुत क्वेरी और विकास के पैटर्न पर निर्भर करता है।

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

जहां आपके डेटा की प्रकृति महीने-दर-साल अलग-अलग हो रही है, वहीं विभाजन के विचार भी मदद कर सकते हैं। एक रिटेलर की कल्पना करें जिसने अपनी उत्पाद लाइनों को लगातार बदल दिया है, जैसे कि उत्पाद में थोड़ी सी स्थिरता है। साल-दर-साल उपयोग में है। एक एकल आदेश / आदेश तालिका और इसलिए एक एकल हिस्टोग्राम के साथ, आँकड़े क्वेरी ऑप्टिमाइज़र को बहुत कम ऑफ़र करेंगे। प्रति वर्ष एक तालिका (ऑर्डर_2010, ऑर्डर_2011, ऑर्डरलाइन_2010, ऑर्डरलाइन_2011) महीने के हिसाब से विभाजित की जाती है और विभाजन के विचारों (ऑर्डर, ऑर्डरलाइन) के साथ संयुक्त रूप से ऑप्टिमाइज़र को अधिक दानेदार और संभावित उपयोगी आंकड़े प्रदान करेगा।

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

किम्बर्ली ट्रिप ने विभाजन पर बहुत सारे मार्गदर्शन और श्वेत पत्र प्रकाशित किए हैं जिन्हें आम तौर पर विषय पर पढ़ने के लिए आवश्यक माना जाता है। केंद्र लिटिल में कुछ अच्छी सामग्री और अन्य लेखों की एक उपयोगी संदर्भ सूची भी है

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

यदि आपके पास नेटवर्क में बैकअप भेजने की आदर्श-आदर्श नहीं बल्कि असामान्य प्रक्रिया है, तो आप अपने वर्तमान 600GB के लिए 3 घंटे का पुनर्स्थापना समय देख सकते हैं। एक वर्ष में जब आपने 1.5TB का उल्लंघन किया है, तो आपको एक समस्या हुई है।


1
+1 के लिए "कॉलम आँकड़े केवल एक टेबल पर बनाए रखे जाते हैं", और मैं चाहता हूं कि मैं किम्बरली और केंद्र के लिंक के लिए फिर से +1 करूं।
मैट एम

1

जैसा कि आपने कहा, आपके यहाँ दो विकल्प हैं:

  1. कई तालिकाओं का उपयोग करें
  2. विभाजन का उपयोग करें

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

2 के साथ, आप अपने अनुक्रमितों को अपने विभाजनों में संरेखित कर सकते हैं, और अपने विभाजनों को अलग-अलग भंडारण में संरेखित कर सकते हैं। जब आप अपने विभाजन फ़ंक्शन और विभाजन योजना को सेट करते हैं, तो विभाजन विभाजन या विलय करने पर यह आपके लिए किया जाता है। इस पद्धति के नियमों में रिकॉर्ड को मैन्युअल रूप से एक नई तालिका में ले जाने की आवश्यकता नहीं है। चूंकि विभाजन फ़ंक्शन और विभाजन योजना आपके लिए इसे संभालती है। इसके अलावा, जैसा कि आपने कहा, डेटा को एक्सेस करने के लिए आवश्यक कोई कोड परिवर्तन नहीं है।

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

विभाजन सारणी बनाना

विभाजन सारणी को संशोधित करना

डेटा के सब्स्क्रिप्शन को मैनेज करने के लिए पार्टिशन डिजाइन करना

उम्मीद है की यह मदद करेगा,

मैट


0

आपके प्रश्न से, आप ऐतिहासिक डेटा (लॉग) का भंडारण कर रहे हैं और आपकी सीमा क्वेरी गति से आती है, न कि भंडारण कक्ष के मुद्दों से। मेरे लिए विभाजन मदद नहीं करेगा।

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


हमारी अभिरुचि यह आधारित है कि किस क्षेत्र का सबसे अधिक उपयोग किया जाता है। हमारे पास 1 क्लस्टर्ड और 2 नॉन क्लस्टर्ड हैं, दोनों ही विज्ञापन के रूप में काम करते हैं। मुझे लगता है कि इसका अधिक आकार यह मुद्दा है।
हंटरएक्स 3
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.