HEAP तालिकाओं के लिए वैध उपयोग परिदृश्य क्या हैं?


31

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

जहाँ तक मैं समझता था कि एक HEAP तालिका केवल ऑडिट टेबल के लिए उपयोगी होगी और / या जहाँ आवेषण चयनों की तुलना में अधिक बार होता है। यह डिस्क स्पेस और डिस्क I / O को बचाएगा क्योंकि बनाए रखने के लिए कोई क्लस्टर इंडेक्स नहीं है और बहुत दुर्लभ रीड की वजह से अतिरिक्त विखंडन एक समस्या नहीं होगी।


1
आप SQL सर्वर के बारे में बात कर रहे हैं?
a_horse_with_no_name

@a_horse_with_no_name हाँ, मैं उस sry का उल्लेख करना भूल गया
marc.d

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


जवाबों:


22

केवल मान्य उपयोग के लिए हैं

  • आयात / निर्यात / ईटीएल प्रक्रियाओं में उपयोग की जाने वाली सारणियाँ।
  • उपयोग करने वाली तालिकाओं का तदर्थ, अस्थायी और अल्पकालिक बैकअप SELECT * INTO..

स्टेजिंग टेबल आमतौर पर उपयोग के पहले / बाद में काफी सपाट और छंटनी की जाती है।

ध्यान दें कि संकुल अनुक्रमणिका डेटा आकार की तुलना में आम तौर पर कुछ छोटा है: डेटा है सूचकांक संरचना के निम्नतम स्तर।

हीप टेबल की भी समस्या है। कम से कम ये:

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

और देखें


2
यह आमतौर पर दो अलग-अलग चीजों के लिए ढेर का उपयोग करता है। ETL स्टेजिंग और वर्क टेबल्स जो कि मैं अस्थायी रूप से डेटा को स्टोर करने के लिए उपयोग करता हूं जब सेट प्रभावी रूप से काम करने के लिए एक टेम्‍प टेबल के लिए बड़ा होता है। जिनमें से सभी को अगले लोड पर काट दिया जाता है।
ज़ेन

वैसे अच्छा सवाल है।
ज़ेन

1
एक मामूली ट्विक - यदि आप बदलाव करने से पहले एक छोटी सी मेज का त्वरित बैकअप बनाने के लिए एक सेलेक्ट इन्टो करते हैं, तो एक डिफॉल्ट रूप से एक ढेर बन जाता है। मैं कहूंगा कि यह एक वैध उपयोग है - लेकिन यह सिर्फ नाइट-पिकिंग है। जैसे ही मुझे पता चला कि मेरा काम पूरा हो गया है, मैं उस ढेर से छुटकारा पाना चाहता हूँ।
ब्रेंट ओजर

@BrentOzar: सहमत हूं, मैं यह हर समय खुद करता हूं। मेरे उत्तर की भावना "दीर्घकालिक और लगातार तालिकाओं" है, लेकिन मैं अपडेट करूंगा
gbn

9

प्रमुख विचार

मैं ढेर के लिए एक महत्वपूर्ण लाभ देखता हूं और एक संकुल टेबल के लिए, साथ ही एक तीसरा विचार जो किसी भी तरह से जा सकता है।

  • एक ढेर आपको अप्रत्यक्ष की एक परत बचाता है। अनुक्रमणिका में पंक्ति ID होती है, जो एक डिस्क स्थान पर सीधे (अच्छी तरह से, वास्तव में नहीं, बल्कि यथासंभव सीधे) इंगित करती है। इस प्रकार, एक ढेर के खिलाफ एक सूचकांक की तलाश एक क्लस्टर तालिका के खिलाफ लगभग आधे गैर-संकुल सूचकांक की लागत होनी चाहिए।

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

  • संकेत पर संदर्भ RIDs, जो 64 बिट हैं। जैसा कि उल्लेख किया गया है, गुच्छेदार मेज पर गैर-क्लस्टर किए गए सूचकांक क्लस्टरिंग कुंजी को संदर्भित करते हैं, जो छोटा (32-बिट INT), समान (64-बिट BIGINT), या बड़ा (48-बिट DATETIME2()प्लस 32-बिट) हो सकता है INT। या 128-बिट GUID)। जाहिर है एक व्यापक संदर्भ बड़े और अधिक महंगे सूचकांकों के लिए बनाता है।

जगह की जरूरतें

इन दो तालिकाओं के साथ:

CREATE TABLE TmpClustered
(
ID1 INT NOT NULL,
ID2 INT NOT NULL
)
ALTER TABLE TmpClustered ADD CONSTRAINT PK_Tmp1 PRIMARY KEY CLUSTERED (ID1)
CREATE UNIQUE INDEX UQ_Tmp1 ON TmpClustered (ID2)

CREATE TABLE TmpNonClustered
(
ID1 INT NOT NULL,
ID2 INT NOT NULL
)
ALTER TABLE TmpNonClustered ADD CONSTRAINT PK_Tmp2 PRIMARY KEY NONCLUSTERED (ID1)
CREATE UNIQUE INDEX UQ_Tmp2 ON TmpNonClustered (ID2)

... प्रत्येक 8.7 एम रिकॉर्ड के साथ आबादी, दोनों के लिए डेटा के लिए आवश्यक स्थान 150 एमबी था; संकुल तालिका सूचकांकों के लिए 120 एमबी, गैर-संकुल सारणी के सूचकांकों के लिए 310 एमबी। यह दर्शाता है कि क्लस्टर इंडेक्स RID की तुलना में संकरा है और क्लस्टरिंग इंडेक्स ज्यादातर "फ्रीबी" है। अनूठे सूचकांकों के बिना ID2, सूचकांक स्थान को गैर-संकुल तालिका (आधा, जैसा कि आप उम्मीद करेंगे) के लिए 155 एमबी की आवश्यकता होती है, लेकिन क्लस्टर पीके के लिए सिर्फ 150 केबी - कुछ भी नहीं।

तो 32-बिट इंडेक्स में 32-बिट फ़ील्ड का एक गैर-क्लस्टर इंडेक्स 32-बिट इंडेक्स (कुल 64 बिट, नाममात्र) के साथ 120 एमबी लिया गया, जबकि 64-बिट के साथ एक ढेर में 32-बिट फ़ील्ड का एक इंडेक्स RID (कुल 96 बिट्स, नाममात्र) ने 155 एमबी लिया, जो 50% की वृद्धि की तुलना में थोड़ा कम है वह भली-भांति 64-बिट से 96-बिट कुंजियों तक जाने की उम्मीद करेगा, लेकिन निश्चित रूप से ओवरहेड है जो आकार में प्रभावी अंतर को कम करता है।

दो तालिकाओं को आबाद करने और उनके सूचक बनाने के लिए प्रत्येक तालिका के लिए समान समय लिया गया। स्कैन या साइक्स से जुड़े सरल परीक्षण चलाने पर, मुझे टेबल्स के बीच कोई भौतिक प्रदर्शन अंतर नहीं मिला, जो कि Microsoft श्वेत पत्र से मेल खाता है जो gbn द्वारा सहायक रूप से जुड़ा हुआ है। कहा कागज अत्यधिक समवर्ती पहुँच के लिए एक महत्वपूर्ण अंतर दिखाती है; मुझे यकीन नहीं है कि ऐसा क्यों होता है, उम्मीद है कि उच्च-मात्रा वाले ओएलटीपी सिस्टम वाले मेरे अनुभव से अधिक कोई हमें बता सकता है।

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

कण एवं टुकड़े

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

जैसा कि @ बरन ने बताया, ढेर को कॉम्पैक्ट करने का कोई सरल तरीका नहीं है। हालांकि, यदि आपकी तालिका धीरे-धीरे समय के साथ बढ़ती है - एक बहुत ही सामान्य मामला - वहाँ बहुत कम कचरा होगा क्योंकि हटाए गए रिक्त स्थान को नए डेटा से भरा जाएगा।

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

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

टी एल; डॉ

मैं डेटा वेयरहाउसिंग आदमी हूं, ओएलटीपी विशेषज्ञ नहीं। वास्तव में तालिकाओं के लिए मैं लगभग हमेशा फ़ील्ड पर एक क्लस्टरिंग इंडेक्स का उपयोग करता हूं, जिसमें अधिकतर रेंज स्कैन की आवश्यकता होती है, आमतौर पर एक दिनांक फ़ील्ड। आयाम तालिकाओं के लिए I PK पर क्लस्टर करता है, इसलिए यह तथ्य तालिकाओं के विरुद्ध मर्ज जॉइन के लिए प्रस्तुत किया जाता है।

क्लस्टरिंग सूचकांकों का उपयोग करने के कई कारण हैं, लेकिन यदि उन कारणों में से कोई भी लागू नहीं होता है, तो ओवरहेड सार्थक नहीं हो सकता है। मुझे संदेह है कि "हमने हमेशा इसे इस तरह से किया है" और सार्वभौमिक रूप से क्लस्टर इंडेक्स का उपयोग करने वाले लोगों के पीछे "यह सिर्फ सबसे अच्छा अभ्यास है"। अपने डेटा और अपने लोड दोनों के साथ प्रयास करें और देखें कि सबसे अच्छा क्या काम करता है।


5

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

हमारा गोदाम एक दिन में ~ 1.5 बिलियन पंक्तियों को लोड करता है और उच्च समवर्ती लिखने और प्रसंस्करण के साथ-साथ पढ़ता है। रिलेशनल स्टोर एक ओएलएपी डेटाबेस का समर्थन करता है और इस प्रकार रीड्स मुख्य रूप से टेबल स्कैन करते हैं। रिपोर्ट और डाउनस्ट्रीम फ़ीड जो जेनरेट किए जाते हैं, वे भी आमतौर पर ऐसे चयनात्मक नहीं होते हैं कि कोई भी इंडेक्स उपयोगी होगा। प्रणाली डेटा की एक स्लाइडिंग विंडो का समर्थन करती है और इस प्रकार एक बार एक टेबल लोड होने के बाद हम शायद ही कभी इसे फिर से लिखते हैं और विभाजन विभाजन के लिए Sch-M ताले की आवश्यकता होती है, बल्कि विभाजन के लिए Sch-S लॉक के लिए Sch-M लॉक की आवश्यकता होती है। प्रणाली को कई तालिकाओं का उपयोग करना पड़ा, हालांकि हमारे पास कुछ विभाजन सारणी भी हैं। कई तालिकाओं के उपयोग से डेटा के विभाजन में आसानी होती है और सफाई चक्रों में भी कमी आती है।

जैसे, कुछ मनमाने कॉलम (ओं) पर एक इंडेक्स ऑर्गेनाइज़्ड टेबल (क्लस्टर्ड टेबल) का अतिरिक्त ओवरहेड, ढेर में सक्षम होने के लिए, OLAP विभाजन की प्रक्रिया करने, कुछ टेबल स्कैन क्वेरी करने और फिर 3 दिन बाद ड्रॉप करने का अर्थ है बस इसके लायक नहीं है। ध्यान दें कि हमारे मामले में डेटा एक बड़े ग्रिड क्लस्टर से वापस आता है, इसलिए डेटा के लिए कोई आदेश नहीं है, इसलिए क्लस्टर इंडेक्स के साथ एक तालिका में डालने से "हॉट स्पॉट" और पेज विभाजन और जैसे अन्य मुद्दों को पेश किया जा सकता है।

इसके अलावा, मुझे लगता है कि पृष्ठों के बिखरे होने के बारे में तर्क थोड़ा असंगत है। क्लस्टर किए गए अनुक्रमणिका में उनके पृष्ठ पूरे फ़ाइल में बिखरे हुए हो सकते हैं। यह सिर्फ इतना है कि फिर से अनुक्रमण करने (1000 से अधिक पृष्ठों को संभालने) के बाद यह ढेर से बेहतर हो सकता है लेकिन फिर आपको भी फिर से सूचकांक करना होगा।

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

[संपादित करें] मुझे शायद यह स्पष्ट करना चाहिए कि केवल हमारे गैर-विभाजित तथ्य तालिकाएं ढेर हैं। विभाजन की गई तालिकाओं और आयाम तालिकाओं में सभी कुशल अनुक्रमणिका आदि का समर्थन करने के लिए अनुक्रमित क्लस्टर होते हैं [संपादित करें] 2.5 बिलियन से 1.5 बिलियन तक सही। आंसू, उन दो संख्या एक दूसरे के बगल में किया जा रहा है। क्या होता है जब मुझे लगता है कि एक फोन पर प्रतिक्रियाएं टाइप करना ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.