अरबों डेटा की पंक्तियों के लिए सर्वश्रेष्ठ डेटाबेस और टेबल डिज़ाइन [बंद]


74

मैं एक एप्लिकेशन लिख रहा हूं जिसे बड़ी मात्रा में इलेक्ट्रिकल और तापमान डेटा को स्टोर और विश्लेषण करने की आवश्यकता है।

मूल रूप से मुझे पिछले कई वर्षों से और कई वर्षों से हजारों स्थानों के लिए आने के लिए और फिर बहुत ही जटिल तरीके से डेटा का विश्लेषण करने के लिए बड़ी मात्रा में प्रति घंटा बिजली उपयोग माप संग्रहीत करने की आवश्यकता है।

मुझे (अब के लिए) स्टोर करने के लिए आवश्यक जानकारी स्थान आईडी, टाइमस्टैम्प (दिनांक और समय), तापमान और विद्युत उपयोग है।

संग्रहीत किए जाने वाले डेटा की मात्रा के बारे में, यह एक अनुमान है, लेकिन उन पंक्तियों के साथ कुछ:
20 000+ स्थान, प्रति माह 720 रिकॉर्ड (प्रति घंटा माप, प्रति माह लगभग 720 घंटे), 120 महीने (10 साल के लिए वापस) ) और भविष्य में कई साल। सरल गणना से निम्नलिखित परिणाम मिलते हैं:

20 000 स्थान x 720 रिकॉर्ड x 120 महीने (10 वर्ष पीछे) = 1 728 000 000 रिकॉर्ड

ये पिछले रिकॉर्ड हैं, नए रिकॉर्ड मासिक रूप से आयात किए जाएंगे, इसलिए यह प्रति माह लगभग 20 000 x 720 = 14 400 000 नए रिकॉर्ड हैं

कुल स्थानों में लगातार वृद्धि होगी।

उस सभी डेटा पर, निम्नलिखित कार्यों को निष्पादित करने की आवश्यकता होगी:

  1. एक निश्चित तिथि और समय अवधि के लिए डेटा प्राप्त करें: दिनांक 01.01.2013 और 01.01.2017 के बीच और 07:00 और 13:00 के बीच एक निश्चित स्थान आईडी के लिए सभी रिकॉर्ड।
  2. एक निश्चित तिथि और समय सीमा के लिए सरल गणितीय संचालन, जैसे कि मिन, मैक्स और एवीजी तापमान और 07:00 और 13:00 के बीच 5 वर्षों के लिए एक निश्चित स्थान आईडी के लिए बिजली का उपयोग।

डेटा मासिक रूप से लिखा जाएगा, लेकिन सैकड़ों उपयोगकर्ताओं (कम से कम) द्वारा लगातार पढ़ा जाएगा, इसलिए पढ़ने की गति काफी अधिक महत्व की है।

मुझे NoSQL डेटाबेस के साथ कोई अनुभव नहीं है लेकिन जो मैंने इकट्ठा किया है, वे यहाँ उपयोग करने के लिए सबसे अच्छा समाधान हैं। मैंने सबसे लोकप्रिय NoSQL डेटाबेस पर पढ़ा है, लेकिन चूंकि वे काफी अलग हैं और बहुत अलग टेबल आर्किटेक्चर के लिए भी अनुमति देते हैं, इसलिए मैं यह तय नहीं कर पाया कि उपयोग करने के लिए सबसे अच्छा डेटाबेस क्या है।

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

मेरे प्रश्न निम्नलिखित हैं:

  1. क्या मुझे इतनी बड़ी मात्रा में डेटा के लिए NoSQL डेटाबेस का उपयोग करना चाहिए। यदि मैं MySQL से नहीं चिपक सकता हूँ?
  2. मुझे किस डेटाबेस का उपयोग करना चाहिए?
  3. क्या मुझे निश्चित समय और दिनांक की अवधि के लिए डेटा को पुनः प्राप्त करने और संसाधित करने के लिए दिनांक और समय को अलग-अलग, अनुक्रमित (यदि संभव हो) कॉलम में रखना चाहिए, या क्या यह एकल स्तंभ में टाइमस्टैम्प रखकर किया जा सकता है?
  4. क्या एक समय श्रृंखला डेटा मॉडलिंग दृष्टिकोण यहाँ उपयुक्त है, और यदि आप मुझे अच्छे टेबल डिज़ाइन के लिए संकेत नहीं दे सकते हैं?

धन्यवाद।


29
2017. जबकि छोटा नहीं है, यह विशेष रूप से उचित हार्डवेयर के लिए डेटा की एक बड़ी राशि नहीं है। और मुझे तुमसे कहने में नफरत है, लेकिन अभी तक तुम्हारे पास क्या है जो रिलेशनल डेटा की तरह लगता है।
टॉम टॉम

6
मैंने MS SQL Server 2008-2014 में दसियों अरबों पंक्तियों के साथ मल्टी-टीबी तालिकाओं को एक अच्छी कुंजी (युग तिथि), संपीड़न, विभाजन का उपयोग करके संग्रहीत किया है और मेरे प्रश्नों / सूचियों को सुनिश्चित करते हुए विभाजन संरेखित किया है। जब मुझे अलग तरीके से विश्लेषण करने और अनुक्रमित करने के लिए पेटाबाइट्स मिलना शुरू हुआ तो मुझे NoSQL (Hadoop) में जाना पड़ा। NoSQL के अन्य विचार होने चाहिए और इस मामले में, यह उचित नहीं लगता है।
अली रज़ेगी

3
@AliRazeghi Hadoop का SQL या NoSQL से कोई लेना-देना नहीं है - यह सिर्फ एक स्टोरेज इंजन है। वहाँ Hadoop द्वारा समर्थित बहुत सारे SQL इंटरफेस हैं।
16-29 में 16

3
आपकी बाधाएं क्या हैं: सॉफ्टवेयर / लाइसेंस पर खर्च करने के लिए पैसा?
user3067860

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

जवाबों:


90

यह वही है जो मैं प्रतिदिन करता हूं, प्रति घंटा डेटा का उपयोग करने के बजाय, मैं 5 मिनट के डेटा का उपयोग करता हूं। मैं हर रोज लगभग 200 मिलियन रिकॉर्ड डाउनलोड करता हूं, इसलिए आप जिस राशि के बारे में यहां बात करते हैं वह कोई समस्या नहीं है। 5 मिनट का डेटा आकार में लगभग 2 टीबी है और मेरे पास मौसम का डेटा स्थान के आधार पर प्रति घंटे 50 साल है। तो चलिए मैं आपको अपने अनुभव के आधार पर सवालों के जवाब देता हूं:

  1. इसके लिए NoSQL का उपयोग न करें। डेटा अत्यधिक संरचित है और एक रिलेशनल डेटाबेस को पूरी तरह से फिट करता है।
  2. मैं व्यक्तिगत रूप से SQL Server 2016 का उपयोग करता हूं और मुझे डेटा की उस मात्रा में गणना लागू करने में कोई समस्या नहीं है। यह मूल रूप से एक PostgreSQL उदाहरण पर था जब मैंने अपना काम शुरू किया था और यह डेटा की मात्रा को संभाल नहीं सका क्योंकि यह एक छोटे से एडब्ल्यूएस उदाहरण पर था।
  3. मैं अत्यधिक तारीख के घंटे के हिस्से को निकालने और इसे तारीख से अलग रखने की सलाह दूंगा। मेरा विश्वास करो, मेरी गलतियों से सीखो!
  4. मैं अधिकांश डेटा सूची-वार (DATE, TIME, DATAPOINT_ID, VALUE) को संग्रहीत करता हूं, लेकिन यह नहीं है कि लोग डेटा की व्याख्या कैसे करना चाहेंगे। डेटा और बड़ी मात्रा में धुरी के खिलाफ कुछ भयावह प्रश्नों के लिए तैयार रहें। परिणाम सेट के लिए डी-सामान्यीकृत तालिका बनाने से डरो मत, जो कि मक्खी पर गणना करने के लिए बहुत बड़ा है।

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

यह बताने के लिए कि मैं तारीख से घंटे को अलग रखने की सलाह देता हूं, यहां कुछ कारण बताए गए हैं कि मैं ऐसा क्यों करता हूं:

  1. जिस तरह से इलेक्ट्रिकल डेटा प्रस्तुत किया जाता है वह ऑवर एंडिंग द्वारा होता है- इसलिए, 01:00 वास्तव में पिछले घंटे के लिए विद्युत शक्ति का औसत है और 00:00 घंटे की समाप्ति 24 है। (यह महत्वपूर्ण है क्योंकि आपको वास्तव में 24 घंटे के मूल्य को शामिल करने के लिए दो तिथियों की खोज करनी है - जिस दिन आप अगले दिन के पहले निशान के अलावा की तलाश कर रहे हैं।) हालांकि, मौसम डेटा वास्तव में एक अग्रेषित तरीके से प्रस्तुत किया जाता है (अगले घंटे के लिए वास्तविक और पूर्वानुमान)। इस डेटा के साथ मेरे अनुभव में, उपभोक्ता उस प्रभाव का विश्लेषण करना चाहते हैं जो मौसम की बिजली की कीमत / मांग पर है। यदि आप स्ट्रेट-अप डेट की तुलना का उपयोग करते थे, तो आप वास्तव में पिछले घंटे के लिए औसत तापमान की तुलना कर सकते हैं। अगले घंटे के लिए औसत तापमान, भले ही समय टिकट समान हो।DATETIME स्तंभ।
  2. प्रदर्शन। मैं कहूंगा कि कम से कम 90% रिपोर्टें मुझे उत्पन्न होती हैं, जो कि ग्राफ हैं, आम तौर पर एक ही तारीख के लिए या तारीख की एक श्रृंखला के लिए घंटे के खिलाफ कीमत की साजिश रचते हैं। दिनांक से समय को विभाजित करने के लिए, उस तिथि सीमा के आधार पर रिपोर्ट उत्पन्न करने के लिए उपयोग की गई क्वेरी की गति को घटा सकते हैं जिसे आप देखना चाहते हैं। उपभोक्ताओं के लिए एक ही तारीख, पिछले 30 वर्षों के लिए साल-दर-साल देखना चाहते हैं (वास्तव में मौसम के लिए यह 30 साल के मानदंडों को उत्पन्न करने के लिए आवश्यक है) - यह धीमा हो सकता है। बेशक आप अपनी क्वेरी को ऑप्टिमाइज़ कर सकते हैं और इंडेक्स जोड़ सकते हैं, और मुझ पर विश्वास कर सकते हैं कि मेरे पास कुछ पागल इंडेक्स हैं जो कि मेरे पास नहीं होंगे, लेकिन यह सिस्टम को तेज चलाता है।
  3. उत्पादकता। मुझे एक से अधिक बार एक ही कोड लिखने में नफरत है। मैं दिनांक और समय को एक ही कॉलम में संग्रहीत करता था, जब तक कि मुझे समय भाग निकालने के लिए एक ही क्वेरी को बार-बार नहीं लिखना पड़ता। थोड़ी देर के बाद मैं बस ऐसा करने के लिए बीमार हो गया और इसे अपने कॉलम में निकाल दिया। जितना कम कोड आपको उतना कम लिखना होगा कि उसमें कोई त्रुटि हो। इसके अलावा, कम कोड लिखने का मतलब है कि आप अपनी रिपोर्ट तेजी से प्राप्त कर सकते हैं, कोई भी रिपोर्ट के लिए पूरे दिन इंतजार नहीं करना चाहता है।
  4. अंत उपयोगकर्ताओं। सभी अंत उपयोगकर्ता पावर उपयोगकर्ता नहीं होते हैं (अर्थात SQL लिखना जानते हैं)। डेटा को पहले से ही एक प्रारूप में संग्रहीत किया गया है जिसे वे एक्सेल (या अन्य समान उपकरण) में ला सकते हैं न्यूनतम प्रयास के साथ आपको कार्यालय में एक नायक बना देगा। यदि उपयोगकर्ता डेटा तक आसानी से पहुंच या हेरफेर नहीं कर सकते हैं, तो वे आपके सिस्टम का उपयोग नहीं करेंगे। मेरा विश्वास करो, मैंने कुछ साल पहले एक आदर्श प्रणाली को डिजाइन किया था और इस कारण से किसी ने भी इसका इस्तेमाल नहीं किया। डेटाबेस डिजाइन केवल नियमों / दिशानिर्देशों के पूर्वनिर्धारित सेट का पालन करने के बारे में नहीं है, यह प्रणाली को प्रयोग करने योग्य बनाने के बारे में है।

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


मेरे पास एपोच तारीख का उपयोग करने का सौभाग्य था लेकिन आपकी सिफारिश आपके उपयोग के मामले के लिए दिलचस्प है। साझा करने के लिए धन्यवाद।
अली रज़ेगी

मैंने मूल रूप से UTC में दिनांक / समय संग्रहीत किया है, लेकिन तब उपभोक्ताओं ने शिकायत की क्योंकि उन्हें हमेशा स्थानीय समय के साथ समायोजित करना होगा। अंततः मेरा डिज़ाइन उपभोक्ताओं के लिए डेटा का उपयोग करना आसान बनाने के लिए बदल गया।
Mr.Brownstone

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

1
आपका हार्डवेयर कैसा है?
केन्स

1
यह अविश्वसनीय हार्डवेयर है कि आप कितने उपयोगकर्ताओं की सेवा करते हैं। चूंकि यह एक छद्म अनुकूलन प्रतिक्रिया है, मुझे लगता है कि आपकी तकनीक भी उपयोगी है। मुझे यह सुनकर पूरा सदमा लगा कि आप 30 सेकंड में 2TB की कमी कर सकते हैं - यह अविश्वसनीय रूप से तेज़ है। मेरा अपना व्यक्तिगत निर्णय एक तरफ, मुझे लगता है कि भविष्य के लोगों के लिए समय-श्रृंखला डेटा का अनुकूलन करना उपयोगी होगा!
kennes

57

PostgreSQL और BRIN इंडेक्स

इसे अपने लिए परखें। यह एक ssd के साथ 5 साल पुराने लैपटॉप पर कोई समस्या नहीं है।

EXPLAIN ANALYZE
CREATE TABLE electrothingy
AS
  SELECT
    x::int AS id,
    (x::int % 20000)::int AS locid,  -- fake location ids in the range of 1-20000
    now() AS tsin,                   -- static timestmap
    97.5::numeric(5,2) AS temp,      -- static temp
    x::int AS usage                  -- usage the same as id not sure what we want here.
  FROM generate_series(1,1728000000) -- for 1.7 billion rows
    AS gs(x);

                                                               QUERY PLAN                                                               
----------------------------------------------------------------------------------------------------------------------------------------
 Function Scan on generate_series gs  (cost=0.00..15.00 rows=1000 width=4) (actual time=173119.796..750391.668 rows=1728000000 loops=1)
 Planning time: 0.099 ms
 Execution time: 1343954.446 ms
(3 rows)

इसलिए तालिका बनाने में 22 मिनट लगे। बड़े पैमाने पर, क्योंकि तालिका एक मामूली 97GB है। अगला हम इंडेक्स बनाते हैं,

CREATE INDEX ON electrothingy USING brin (tsin);
CREATE INDEX ON electrothingy USING brin (id);    
VACUUM ANALYZE electrothingy;

इंडेक्स बनाने में भी अच्छा समय लगा। यद्यपि वे ब्रिन हैं क्योंकि वे केवल 2-3 एमबी हैं और वे आसानी से स्टोर करते हैं RAM। 96 GB पढ़ना तात्कालिक नहीं है, लेकिन यह आपके कार्यभार पर मेरे लैपटॉप के लिए एक वास्तविक समस्या नहीं है।

अब हम इसे क्वेरी करते हैं।

explain analyze
SELECT max(temp)
FROM electrothingy
WHERE id BETWEEN 1000000 AND 1001000;
                                                                 QUERY PLAN                                                                  
---------------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=5245.22..5245.23 rows=1 width=7) (actual time=42.317..42.317 rows=1 loops=1)
   ->  Bitmap Heap Scan on electrothingy  (cost=1282.17..5242.73 rows=993 width=7) (actual time=40.619..42.158 rows=1001 loops=1)
         Recheck Cond: ((id >= 1000000) AND (id <= 1001000))
         Rows Removed by Index Recheck: 16407
         Heap Blocks: lossy=128
         ->  Bitmap Index Scan on electrothingy_id_idx  (cost=0.00..1281.93 rows=993 width=0) (actual time=39.769..39.769 rows=1280 loops=1)
               Index Cond: ((id >= 1000000) AND (id <= 1001000))
 Planning time: 0.238 ms
 Execution time: 42.373 ms
(9 rows)

टाइमस्टैम्प के साथ अद्यतन करें

यहां हम अलग-अलग टाइमस्टैम्प के साथ एक तालिका उत्पन्न करते हैं ताकि टाइमस्टैम्प कॉलम पर अनुक्रमण और खोज करने के लिए अनुरोध पर व्यंग्य किया जा सके, सृजन में थोड़ा अधिक समय लगता है क्योंकि to_timestamp(int)इसकी तुलना में काफी धीमी गति से होता है now()(जो लेनदेन के लिए कैश किया जाता है)

EXPLAIN ANALYZE
CREATE TABLE electrothingy
AS
  SELECT
    x::int AS id,
    (x::int % 20000)::int AS locid,
    -- here we use to_timestamp rather than now(), we
    -- this calculates seconds since epoch using the gs(x) as the offset
    to_timestamp(x::int) AS tsin,
    97.5::numeric(5,2) AS temp,
    x::int AS usage
  FROM generate_series(1,1728000000)
    AS gs(x);

                                                               QUERY PLAN                                                                
-----------------------------------------------------------------------------------------------------------------------------------------
 Function Scan on generate_series gs  (cost=0.00..17.50 rows=1000 width=4) (actual time=176163.107..5891430.759 rows=1728000000 loops=1)
 Planning time: 0.607 ms
 Execution time: 7147449.908 ms
(3 rows)

अब हम इसके बजाय टाइमस्टैम्प मान पर एक क्वेरी चला सकते हैं,

explain analyze
SELECT count(*), min(temp), max(temp)
FROM electrothingy WHERE tsin BETWEEN '1974-01-01' AND '1974-01-02';
                                                                        QUERY PLAN                                                                         
-----------------------------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=296073.83..296073.84 rows=1 width=7) (actual time=83.243..83.243 rows=1 loops=1)
   ->  Bitmap Heap Scan on electrothingy  (cost=2460.86..295490.76 rows=77743 width=7) (actual time=41.466..59.442 rows=86401 loops=1)
         Recheck Cond: ((tsin >= '1974-01-01 00:00:00-06'::timestamp with time zone) AND (tsin <= '1974-01-02 00:00:00-06'::timestamp with time zone))
         Rows Removed by Index Recheck: 18047
         Heap Blocks: lossy=768
         ->  Bitmap Index Scan on electrothingy_tsin_idx  (cost=0.00..2441.43 rows=77743 width=0) (actual time=40.217..40.217 rows=7680 loops=1)
               Index Cond: ((tsin >= '1974-01-01 00:00:00-06'::timestamp with time zone) AND (tsin <= '1974-01-02 00:00:00-06'::timestamp with time zone))
 Planning time: 0.140 ms
 Execution time: 83.321 ms
(9 rows)

नतीजा:

 count |  min  |  max  
-------+-------+-------
 86401 | 97.50 | 97.50
(1 row)

तो 83.321 एमएस में हम 1.7 बिलियन पंक्तियों वाली तालिका में 86,401 रिकॉर्ड एकत्र कर सकते हैं। यह उचित होना चाहिए।

घंटे का अंत

घंटे की समाप्ति की गणना करना बहुत आसान है, टाइमस्टैम्प को नीचे की ओर झुकाएं और फिर बस एक घंटा जोड़ें।

SELECT date_trunc('hour', tsin) + '1 hour' AS tsin,
  count(*),
  min(temp),
  max(temp)
FROM electrothingy
WHERE tsin >= '1974-01-01'
  AND tsin < '1974-01-02'
GROUP BY date_trunc('hour', tsin)
ORDER BY 1;
          tsin          | count |  min  |  max  
------------------------+-------+-------+-------
 1974-01-01 01:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 02:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 03:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 04:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 05:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 06:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 07:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 08:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 09:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 10:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 11:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 12:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 13:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 14:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 15:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 16:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 17:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 18:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 19:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 20:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 21:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 22:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 23:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-02 00:00:00-06 |  3600 | 97.50 | 97.50
(24 rows)

Time: 116.695 ms

यह ध्यान रखना महत्वपूर्ण है, कि यह एकत्रीकरण पर एक सूचकांक का उपयोग नहीं कर रहा है, हालांकि यह हो सकता है। यदि आपकी आमतौर पर यह क्वेरी है कि आप संभवतः ब्रिन पर date_trunc('hour', tsin)एक छोटी सी समस्या date_truncचाहते हैं तो इसमें कोई समस्या नहीं है, इसलिए आपको इसे बनाने के लिए पहले इसे लपेटना होगा।

विभाजन

PostgreSQL पर जानकारी का एक और महत्वपूर्ण बिंदु यह है कि PG 10 विभाजनकारी DDL लाता है । उदाहरण के लिए, आप हर साल आसानी से विभाजन बना सकते हैं। अपने मामूली डेटाबेस को छोटे लोगों में तोड़ना जो छोटे हैं। ऐसा करने में, आपको ब्रिन के बजाय btree इंडेक्स का उपयोग करने और बनाए रखने में सक्षम होना चाहिए जो कि और भी तेज होगा।

CREATE TABLE electrothingy_y2016 PARTITION OF electrothingy
    FOR VALUES FROM ('2016-01-01') TO ('2017-01-01');

जो कुछ भी।


13

यह मुझे आश्चर्यचकित करता है कि यहां किसी ने भी बेंचमार्किंग का उल्लेख नहीं किया है - जब तक कि @EvanCarroll उनके उत्कृष्ट योगदान के साथ नहीं आया!

अगर मैं आप थे, तो मैं कुछ समय बिताऊंगा (और हाँ, मुझे पता है कि यह एक कीमती वस्तु है!) सिस्टम स्थापित करना, जो आपको लगता है कि चल रहा है (यहां अंत-उपयोगकर्ता इनपुट प्राप्त करें!), कहते हैं, आपके 10 सबसे सामान्य प्रश्न।

मेरे अपने विचार:

NoSQL समाधान विशेष रूप से उपयोग के मामलों के लिए बहुत अच्छी तरह से काम कर सकते हैं, लेकिन अक्सर तदर्थ प्रश्नों के लिए अनम्य होते हैं। ब्रायन एकर द्वारा NoSQL पर एक मनोरंजक लेने के लिए - MySQL के पूर्व मुख्य वास्तुकार, यहाँ देखें !

मैं @ Mr.Brownstone से सहमत हूं कि आपका डेटा प्रमुख रूप से एक संबंधपरक समाधान के अनुकूल है (और इवान कैरोल द्वारा इस राय की पुष्टि की गई है )!

अगर मैं किसी भी खर्च के लिए प्रतिबद्ध था, तो यह मेरी डिस्क तकनीक के लिए होगा! मैं एनएएस या सैन पर अपने निपटान में कोई भी पैसा खर्च कर रहा हूं या शायद कुछ एसएसडी डिस्क्स मेरे दुर्लभ लिखित डेटा को रखने के लिए हैं!

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

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

इस तरह के एक प्रोजेक्ट के लिए कॉल का मेरा अपना पहला पहला पोर्ट PostgreSQL होगा। यह कहने के लिए नहीं है कि मैं एक मालिकाना समाधान पर शासन करूंगा, लेकिन भौतिकी और डिस्क के नियम सभी के लिए समान हैं! "हां कैन ने बीट इन द ओ फिजिक्स जिम" :-)


6

यदि आप पहले से ही नहीं है, तो एक बार श्रृंखला DBMS पर एक नज़र डालें, क्योंकि यह डेटा संग्रहीत करने और क्वेरी करने के लिए अनुकूलित है जहां प्राथमिक फोकस दिनांक / समय प्रकार है। आमतौर पर समय श्रृंखला डेटाबेस का उपयोग मिनट / सेकंड / सब-सेकंड रेंज में डेटा रिकॉर्ड करने के लिए किया जाता है, इसलिए मुझे यकीन नहीं है कि यह अभी भी प्रति घंटा वेतन वृद्धि के लिए उपयुक्त है। उस ने कहा, इस प्रकार का DBMS देखने लायक लगता है। वर्तमान में InfluxDB सबसे अधिक स्थापित और व्यापक रूप से उपयोग की जाने वाली टाइम सीरीज़ डेटाबेस प्रतीत होती है।


1
एक समय श्रृंखला DBMS का एक उदाहरण है?
बिशप

2
यहाँ एक नज़र है
वेर्रेस

4

स्पष्ट रूप से यह एक NoSQL समस्या नहीं है, लेकिन मैं सुझाव दूंगा कि जब RDBMS समाधान काम करेगा, तो मुझे लगता है कि एक OLAP दृष्टिकोण बहुत बेहतर होगा और इसमें बहुत सीमित डेटा रेंज शामिल है, मैं दृढ़ता से एक कॉलम आधारित DB के उपयोग की जांच करने का सुझाव दूंगा बल्कि फिर पंक्ति आधारित एक। इसके बारे में इस तरह से सोचें, आपके पास 1.7 बिलियन डेटा हो सकते हैं, लेकिन आपको अभी भी महीने के हर घंटे या दिन के हर संभव मूल्य को सूचीबद्ध करने के लिए केवल 5 बिट्स की आवश्यकता है।

मेरे पास एक समान समस्या वाले डोमेन के साथ अनुभव है जहां Sybase IQ (अब SAP IQ) का उपयोग टेलीकॉम उपकरण प्रदर्शन प्रबंधन डेटा के एक घंटे में 300 मिलियन काउंटर तक करने के लिए किया जाता है, लेकिन मुझे संदेह है कि यदि आपके पास उस तरह के समाधान के लिए बजट है। खुले स्रोत के क्षेत्र में, MariaDB ColumnStore एक बहुत ही होनहार उम्मीदवार है, लेकिन मैं MonetDB की जांच करने की भी सिफारिश करूंगा।

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

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


यदि आप उन लोगों को देख रहे हैं, तो आप ग्रीनप्लम को एक स्तंभ भंडार के रूप में भी देख सकते हैं! "बोनस" के रूप में - यह PostgreSQL पर आधारित है!
वेर्रेस

मुझे एचपी वर्टिका के साथ अच्छा अनुभव हुआ है। हमारे पास 9 स्तंभों वाली एक एकल तालिका थी जिसमें बहुत अधिक ट्यूनिंग के बिना 130bn पंक्तियां थीं। यह सिर्फ काम किया।
ThatDataGuy
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.