2008-09-23 17 views
15

मान लेते हैं कि आप तीन स्तंभों के साथ एक बड़े पैमाने पर तालिका है जैसा कि नीचे दिखाया करते हैं:एसक्यूएल सर्वर - विभाजित टेबल्स बनाम क्लस्टर्ड इंडेक्स?

[id] INT NOT NULL, 

[date] SMALLDATETIME NOT NULL, 

[sales] FLOAT NULL 

भी मान लें कि आपके एक भौतिक डिस्क और एक filegroup (प्राथमिक) तक सीमित हैं। आप उम्मीद करते हैं कि इस तालिका में 100,000+ तिथियों (आसानी से 1 बी + रिकॉर्ड) में 10,000,000+ आईडी के लिए बिक्री होनी चाहिए।

कई डेटा वेयरहाउसिंग परिदृश्यों के साथ, डेटा आमतौर पर तिथि के अनुसार अनुक्रमिक रूप से बढ़ेगा (यानी, प्रत्येक बार जब आप डेटा लोड करते हैं, तो आप नई तिथियां डालेंगे, और शायद डेटा की कुछ और तारीखों को अपडेट कर सकते हैं)। विश्लेषणात्मक उद्देश्यों के लिए, डेटा को अक्सर ~ 10,000 आईडी के यादृच्छिक सेट के लिए पूछताछ और समेकित किया जाएगा जिसे किसी अन्य तालिका के साथ जुड़ने के माध्यम से निर्दिष्ट किया जाएगा। अक्सर, ये प्रश्न दिनांक सीमा निर्दिष्ट नहीं करते हैं, या बहुत विस्तृत दिनांक सीमा निर्दिष्ट करते हैं, जो मुझे मेरे प्रश्न पर ले जाता है: इस तालिका को अनुक्रमणित/विभाजित करने का सबसे अच्छा तरीका क्या है?

मैं थोड़ी देर के लिए इस बारे में सोचा है, लेकिन विरोधी समाधान के साथ अटक कर रहा हूँ:

विकल्प # 1: डेटा दिनांक के आधार पर क्रमिक रूप से लोड किया जाएगा के रूप में, के रूप में संकुल सूचकांक (और प्राथमिक कुंजी) को परिभाषित [ तारीख], [आईडी]। तालिका में नए डेटा के तेज़ी से चलने की इजाजत देने की तिथि पर एक "स्लाइडिंग विंडो" विभाजन समारोह/योजना भी बनाएं। पूछताछ में सहायता के लिए संभावित रूप से आईडी पर एक गैर-क्लस्टर सूचकांक बनाएं।

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

विकल्प # 2: डेटा एक समय में केवल आईडी के एक छोटे सबसेट के लिए क्वेरी की हो जाएगा के रूप में, के रूप में [id] क्लस्टर सूचकांक (और प्राथमिक कुंजी) को परिभाषित, [तिथि]। विभाजित तालिका बनाने के लिए परेशान मत करो।

अपेक्षित परिणाम # 2: डेटा लोड करने की बात आने पर अपेक्षित भारी प्रदर्शन मारा गया क्योंकि हम अब तिथि से तुरंत सीमित नहीं हो सकते हैं। मेरे विश्लेषणात्मक प्रश्नों की बात होने पर अपेक्षित विशाल प्रदर्शन लाभ के रूप में यह पढ़ने वाले डेटा पृष्ठों की संख्या को कम करेगा।

विकल्प # 3: क्लस्टर (और प्राथमिक कुंजी) निम्नानुसार है: [आईडी], [दिनांक]; तारीख पर "स्लाइडिंग विंडो" विभाजन समारोह/योजना।

अपेक्षित परिणाम # 3: सुनिश्चित नहीं है कि क्या उम्मीद करनी है। यह देखते हुए कि क्लस्टर इंडेक्स में पहला कॉलम [आईडी] है और इस प्रकार (यह मेरी समझ है) डेटा आईडी द्वारा व्यवस्थित किया जाता है, मैं अपने विश्लेषणात्मक प्रश्नों से अच्छा प्रदर्शन की अपेक्षा करता हूं। हालांकि, डेटा तिथि के आधार पर विभाजित है, जो क्लस्टर इंडेक्स की परिभाषा के विपरीत है (लेकिन अभी भी तारीख के रूप में गठबंधन है इंडेक्स का हिस्सा है)। मुझे इस परिदृश्य से बात करने वाले बहुत से दस्तावेज नहीं मिले हैं और यदि कोई है, तो मुझे लाभ का लाभ मिल सकता है, जो मुझे अपने अंतिम, बोनस प्रश्न पर लाता है:

यदि मैं एक फ़ाइल समूह पर एक टेबल बना रहा हूं एक कॉल पर क्लस्टर इंडेक्स के साथ एक डिस्क, क्या कोई लाभ है (डेटा लोड करते समय विभाजन स्विचिंग के अलावा) जो एक ही कॉलम पर विभाजन को परिभाषित करने से आता है?

उत्तर

0

यदि आप चुनिंदा वक्तव्य में विभाजन का उपयोग कर रहे हैं, तो आप कुछ गति प्राप्त कर सकते हैं।

यदि आप इसका उपयोग नहीं कर रहे हैं, तो केवल "मानक" चयन का उपयोग करके, आपको कोई लाभ नहीं है।

आपकी मूल समस्या पर: मैं आपको आईडी पर गैर-क्लस्टर इंडेक्स के साथ विकल्प # 1 की अनुशंसा करता हूं।

3

एक क्लस्टर्ड इंडेक्स आपको I/O को स्थानीयकरण करते समय प्रश्नों के लिए प्रदर्शन लाभ प्रदान करेगा। तिथि पारंपरिक विभाजन रणनीति है क्योंकि कई डी/डब्ल्यू प्रश्न आज तक आंदोलनों को देखते हैं।

विभाजन तालिका के लिए अंगूठे का एक नियम बताता है कि विभाजन आकार में लगभग 10 मीटर पंक्तियां होनी चाहिए।

एक विविध विश्लेषणात्मक वर्कलोड पर क्लस्टर इंडेक्स से अधिक प्रदर्शन लाभ देखने के लिए कुछ असामान्य होगा। क्वेरी ऑप्टिमाइज़र तथ्यों को मारने के बिना पंक्तियों का चयन करने के लिए 'Index Intersection' नामक तकनीक का उपयोग करेगा। एक पोस्ट के लिए Here देखें मैंने एक और प्रश्न पर किया जो कुछ लिंक के साथ अधिक गहराई में बताता है। एक क्लस्टर इंडेक्स इंडेक्स चौराहे में भाग ले सकता है या नहीं भी हो सकता है, ताकि आप पाएंगे कि यह आपको सामान्य क्वेरी वर्कलोड पर अपेक्षाकृत कम करता है।

आपको लोडिंग में परिस्थितियां मिल सकती हैं जहां क्लस्टर्ड इंडेक्स आपको कुछ लाभ देते हैं, खासकर यदि आपने गणना की है (जैसे Earned Premium) जिन्हें ईटीएल प्रक्रिया के भीतर गणना की जाती है। इस मामले में आपको कुछ लाभ मिल सकते हैं। यदि आपके पास एक विशिष्ट क्वेरी है जिसे आप जानते हैं तो इसे हर समय निष्पादित किया जाएगा, इसके लिए क्लस्टर इंडेक्स का उपयोग करना समझ में आता है। विकल्प # 2 और # 3 केवल तभी लाभान्वित होंगे जब आप इस प्रकार की क्वेरी को आवेदन द्वारा किए गए कार्यों का भारी बहुमत होने की उम्मीद करते हैं।

एक लचीली प्रणाली के लिए, आईडी पर एक इंडेक्स के साथ एक साधारण तिथि सीमा विभाजन (और यदि विभाजन श्रेणी को धारण करता है तो शायद आपको किसी भी प्रदर्शन के रूप में अच्छा प्रदर्शन मिल जाएगा। आपको सूचकांक सीमित करने से कुछ लाभ मिल सकता है । परिस्थितियों तुम भी डेटा पर एक घन के निर्माण और यह सुनिश्चित करना कि एकत्रित इस प्रश्न के लिए सही ढंग से स्थापित कर रहे हैं से कुछ लाभ मिल सकता है

0

मैं निम्नलिखित करना होगा:।

  • गैर क्लस्टर पर सूचकांक [ आईडी]
  • क्लस्टरेड इंडेक्स [दिनांक]
  • [बिक्री] डेटाप्रकार नाव
+0

आपका अंतिम बिंदु दिलचस्प है। फ्लोट से न्यूमेरिक में कनवर्ट करने से आप किस तरह के प्रदर्शन लाभ की अपेक्षा करेंगे? –

+1

आप जो डेटा संग्रहीत कर रहे हैं उसके बारे में आप अधिक सटीक हो सकते हैं और संख्यात्मक डेटा प्रकार एक सटीक संख्या है जहां फ्लोट अनुमानित संख्या है। – GateKiller

7

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

मैं यह कर जाएगा:

CREATE TABLE Narrow 
(
    [id] INT NOT NULL, 
    [date] SMALLDATETIME NOT NULL, 
    [sales] FLOAT NULL, 
    PRIMARY KEY(id, date) --EDIT, just noticed your id is not unique. 
) 

CREATE INDEX CoveringNarrow ON Narrow(date, id, sales) 

इस के साथ बिंदु प्रश्नों संभालती है चाहता है और तारीख मानदंड और आईडी मानदंडों के खिलाफ सीमित स्कैन के साथ व्यापक रेंज प्रश्नों। इंडेक्स से कोई प्रति-रिकॉर्ड लुकअप नहीं है। हां, मैंने लिखने का समय दोगुना कर दिया है (और अंतरिक्ष का उपयोग किया गया है) लेकिन यह ठीक है, इमो।


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

CREATE VIEW Narrow200801 
AS 
SELECT * FROM Narrow WHERE '2008-01-01' <= [date] AND [date] < '2008-02-01' 
--There is some command that I don't have at my finger tips to make this a clustered view. 

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

SELECT SUM(sales) FROM Narrow WHERE '2008-01-01' <= [date] AND [date] < '2008-02-01' 

के रूप में सूचकांक की मदद से आप विशिष्ट स्तंभ आसानी से सुलभ बनाने के ... क्लस्टर किया गया दृश्य आप विशिष्ट पंक्तियों आसानी से सुलभ बनाने की सुविधा देता है।

+0

प्रतिक्रिया के लिए धन्यवाद। मैं क्लस्टर विचारों से परिचित नहीं हूं। जब मैंने इसे गुगल किया तो कोई स्पष्ट परिणाम वापस नहीं आया। क्या आप मुझे कुछ और जानकारी प्रदान कर सकते हैं? –

+0

निश्चित रूप से, यहां msdn http://msdn.microsoft.com/en-us/library/aa933148.aspx बड़ी आवश्यकता schemabinding (जो इस संरचना मौजूद है, पर निर्भर संरचनाओं में परिवर्तन को लॉक करता है)। –

0

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

0

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

मैं आपके विकल्पों में से # 2 के साथ जाऊंगा।

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