गतिशील रूप से विकसित आयाम वाले तथ्यों के लिए अच्छा (== तेज़) संग्रहण रणनीति?

I need to store large amounts of metering data in a database. A record consists of an id that identifies the data's source, a timestamp and a value. The records are later retrieved via the id and their timestamp.

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

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

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

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

ईटीए: एस लॉट ने यह उत्तर पोस्ट किया है, जो चर्चा के लिए सहायक भी है अगर मैं इसे सीधे उपयोग नहीं कर सकता (मेरी टिप्पणियां देखें)। यहां बिंदु यह है कि मेरे "तथ्यों" के लिए "आयाम" अंतिम उपयोगकर्ता द्वारा प्रभावित होते हैं और समय के साथ बदलते हैं (और होना चाहिए)। यह ऐप की मुख्य विशेषता है और असल में मैं इस सवाल के साथ पहले स्थान पर घायल हूं।

0

5 उत्तर

विकल्प 1:

इस बात पर एक अच्छा अनुमान लगाएं कि क्या अक्सर एक साथ लोड किया जा रहा है और इसे एक में रखा गया है, बहुत बड़ा हिस्सा नहीं। उदाहरण: एक दिन में एक हिस्सा है

पेशेवरों:

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

विपक्ष:

  • सर्वश्रेष्ठ प्रदर्शन नहीं
  • एप्लिकेशन के उपयोगकर्ताओं के बदलते व्यवहार के अनुकूल नहीं है
0
जोड़ा

विकल्प 2:

एक चतुर "पुनर्वित्त रणनीति" विकसित करें, जो डेटा को एक साथ लोड होने का ट्रैक रखेगा और सामान को एक साथ रखने की कोशिश करता है जो अक्सर एक साथ लोड हो जाता है। इसमें कई हिस्सों में पंक्तियों की प्रतियां रखना शामिल हो सकता है।

पेशेवरों:

  • लगभग मनमाने ढंग से स्मार्ट हो सकता है
  • बहुत प्रभावी प्रदर्शन-वार
  • बनाया जा सकता है
  • एक विकसित रणनीति के लिए अनुमति देता है

विपक्ष:

  • विकसित करने, परीक्षण करने और डीबग करने के लिए लगभग मनमाने ढंग से कठिन हो सकता है
  • खराब प्रदर्शन से पीड़ित हो सकता है जब तक कि स्व-अनुकूलन
  • में लात नहीं हो जाता है
  • रिकॉर्ड्स की कई प्रतियां भंडारण को मिटा सकती हैं
  • किसी भी तरह मुझे लगता है कि यह डेटाबेस द्वारा किया जाना चाहिए
0
जोड़ा

विकल्प 3:

एक चालाक डेटाबेस सुविधा खोजें जो नौकरी करेगी।

0
जोड़ा

"पंक्तियों के समूह जो आईड्स और टाइमस्टैम्प की एक श्रृंखला से मेल खाते हैं"

आपके पास दो आयाम हैं: स्रोत और समय। मुझे यकीन है कि डेटा स्रोत में बहुत सारे गुण हैं। समय, मुझे पता है, इसमें बहुत सारे गुण हैं (वर्ष, महीना, दिन, घंटा, सप्ताह का दिन, वर्ष का सप्ताह, तिमाही, राजकोषीय अवधि इत्यादि)

जबकि आपके तथ्यों में "आईडी" और टाइमस्टैम्प है, लेकिन उनके पास डेटा स्रोत आयाम और समय आयाम के लिए एफके हो सकता है।

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

एक बार जब आप डेटा स्रोत आयाम के इन विशेषताओं को परिभाषित कर लेते हैं, तो आपकी "चंकिंग" रणनीति काफी स्पष्ट होनी चाहिए।

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

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

0
जोड़ा
आप स्टार्ट स्कीमा के बारे में सही हैं। हालांकि, "डेटा स्रोत आयाम के गुणों को परिभाषित करना" मैं यहां की तलाश में स्टोरेज रणनीति की तुलना में सभी मामूली और यहां तक ​​कि अधिक गतिशील नहीं हूं। ऐसा इसलिए है क्योंकि उपयोगकर्ता अपने दिल की खुशी के लिए स्रोतों को वर्गीकृत और वर्गीकृत कर सकता है।
जोड़ा लेखक Hanno Fietz, स्रोत
एक आईडी के साथ आने के लिए और समय पहले से ही मूल स्कीमा से कुछ आयामों (जैसे भौतिक इकाई) को हटाने का मतलब है जो वर्तमान में उत्पादन में है (और कुछ सालों से रहा है)। मेरा लक्ष्य भंडारण और पुनर्प्राप्ति भाग से उस तर्क को और अधिक लचीला बनाने के लिए अलग करना है।
जोड़ा लेखक Hanno Fietz, स्रोत
@ हैनो: "उपयोगकर्ता अपने दिल की खुशी के लिए स्रोतों को समूहबद्ध और वर्गीकृत कर सकता है" सभी संभावित चंकिंग रणनीतियों को हराया। मैं बिटमैप इंडेक्स द्वारा खड़ा हूं।
जोड़ा लेखक S.Lott, स्रोत
@ हैनो: मैं उपयोगकर्ता के समूह और भंडारण से क्लस्टरिंग को अलग नहीं करता। उपयोगकर्ता के क्वेरी परिणाम वे हैं जिन्हें आप अनुकूलित करना चाहते हैं। मुझे लगता है कि कोई "पिक्सी धूल" नहीं है जो इस समस्या को जादुई रूप से हल करेगी। यह मुश्किल है।
जोड़ा लेखक S.Lott, स्रोत

For options 1 & 3 you need a really good idea of what your most frequent queries are going to be. Use the 80/20 rule, don't try to make all queries perform at the same level.

विकल्प 2 दिलचस्प लग रहा है, लेकिन बहीखाता थोड़ा बालों वाली हो सकती है।

विकल्प 3 में कुछ वादा है कि यह प्रदर्शन के मुद्दे को एप्लिकेशन में कम या कोई बदलाव के साथ संबोधित कर सकता है। दो चीजें जो मैं सुझाव देना चाहूंगा:

  1. तालिका विभाजन। ओरेकल और एमएस एसक्यूएल सर्वर (और अन्य, मुझे यकीन है) कुछ मूल्य (इस मामले में, तिथि/समय टिकट) द्वारा भौतिक रूप से तालिका में डेटा को समूहीकृत करने का समर्थन करते हैं। हार्डवेयर में लोड फैलाने के लिए आप विभिन्न भौतिक उपकरणों पर रहने के लिए विभाजन को कॉन्फ़िगर कर सकते हैं, उम्मीद है कि विलंबता कम हो रही है।
  2. शामिल कॉलम के साथ अनुक्रमण। यह हमेशा मुझे प्रतिद्वंद्वी लगता है, लेकिन उन स्तंभों को जोड़कर जिन्हें आप इंडेक्स में पुनर्प्राप्त करना चाहते हैं, वास्तविक प्रश्नों को मारने के बिना पूरे प्रश्न निष्पादित किए जा सकते हैं।

इन दोनों विकल्पों का नकारात्मक हिस्सा उत्परिवर्तन संचालन (सम्मिलित/हटाएं) पर है जहां इंडेक्स को अद्यतन किया जाना है।

आप # 2 के स्वाद के साथ 1 और 3 के संयोजन (वे कई तरीकों से समान हैं) का प्रयास करना चाह सकते हैं। आंकड़ों का ट्रैक रखें कि किस समय अवधि की अक्सर पूछताछ की जाती है (विकल्प 2) और मूल प्रश्नों के प्रदर्शन को स्वीकार्य होने तक समय-समय पर रणनीतियों को फिर से देखें।

0
जोड़ा