सवाल स्केलेबिलिटी पर विचार करते समय बुरे क्यों शामिल होते हैं?


बुरी या 'धीमी' क्यों शामिल हो रही है। मुझे पता है मैंने इसे एक बार फिर सुना है। मुझे यह उद्धरण मिला

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

स्रोत

मैंने हमेशा सोचा कि वे तेजी से थे जब पीके की तलाश में। वे धीमे क्यों हैं?


76
2018-04-12 17:02


मूल




जवाब:


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

अच्छी खबर यह है कि आधुनिक संबंधपरक डेटाबेस हैं अच्छा जुड़ने पर आपको वास्तव में अच्छे डेटाबेस के साथ धीमे होने के बारे में नहीं सोचना चाहिए। डेटाबेस कच्चे जुड़ने और उन्हें बनाने के कई तरीके प्रदान करता है बहुत और तेज:

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

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

यदि आपके पास धीमी गति से जुड़ना है, तो संभवतः आप अपने डेटाबेस का सही ढंग से उपयोग नहीं कर रहे हैं। 

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

* वह है, केवल सारणी के संग्रह से अलग इकाइयों के रूप में मौजूद है। वास्तविक rdbms के लिए एक अतिरिक्त कारण सुरक्षित समवर्ती पहुंच है।


76
2018-04-12 17:23



इंडेक्स शायद सूची के शीर्ष पर होना चाहिए। बहुत सारा (खांसी) डेवलपर्स उनके बारे में भूल जाते हैं जब एक छोटे से डेटा सेट पर परीक्षण करते हैं और फिर डेटाबेस को घुटनों पर उत्पादन में लाते हैं। मैंने ऐसे प्रश्न देखे हैं जो इंडेक्स जोड़कर बस 100,000 गुना तेजी से चलते हैं। और यह बाईं ओर उपसर्ग मिलान के लिए सबसे अच्छा मिश्रण निर्धारित करने के लिए गहराई से डेटा विश्लेषण किए बिना मनमाने ढंग से इंडेक्स है। - Duncan
मुझे लगता है कि मेरे पास सही के बारे में ऑर्डर है- यह केवल अधिकांश डेवलपर्स पहले आइटम ही कर चुके हैं, और इसलिए इंडेक्स पहला आइटम है जहां उन्हें बदलाव करने की आवश्यकता होगी। - Joel Coehoorn
आपके तीसरे आइटम में, आप "भौतिक / अनुक्रमित दृश्य" का उल्लेख करते हैं। क्या आप नियमित रूप से एसक्यूएल विचारों के बारे में बात कर रहे हैं, या कुछ और? - slolife
@slolife नियमित एसक्यूएल विचार फ्लाई पर पृष्ठभूमि में एक अतिरिक्त क्वेरी चलाने की तरह हैं जब आप एक संदर्भ का उपयोग करते हैं जो दृश्य का संदर्भ देता है। लेकिन आप एसक्यूएल सर्वर को कुछ विचारों को "भौतिक" करने के लिए भी बता सकते हैं। जब आप ऐसा करते हैं, तो SQL सर्वर एक नियमित तालिका की तरह दृश्य के डेटा की एक अतिरिक्त प्रतिलिपि रखेगा, जैसे कि जब आप किसी क्वेरी में दृश्य का संदर्भ देते हैं तो इसे पृष्ठभूमि में इस क्वेरी को चलाने की आवश्यकता नहीं है क्योंकि डेटा पहले से मौजूद है । प्रदर्शन को ट्यून करने में आपकी सहायता के लिए, आप स्रोत तालिका की तुलना में दृश्य पर विभिन्न इंडेक्स भी डाल सकते हैं। - Joel Coehoorn
धन्यवाद जोएल। मुझे उसमें देखना होगा। - slolife


शामिल हो सकता है और धीमा डी-सामान्यीकरण के माध्यम से उन्हें टालने से बचाने के लिए, लेकिन अगर सही तरीके से उपयोग किया जाता है (उपयुक्त इंडेक्स के साथ कॉलम पर शामिल होना) वे स्वाभाविक रूप से धीमी नहीं हैं

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


28
2018-04-12 17:11



... MySQL को छोड़कर, जो आपकी अनुक्रमणिका को कैसे दिखता है इस पर ध्यान दिए बिना बड़ी संख्या में जुड़ने के साथ प्रदर्शन समस्याएं होती हैं। या कम से कम यह अतीत में है। - Powerlord
प्वाइंट लिया गया है, यदि विशिष्ट डीबीएमएस (और शायद संस्करण भी) के साथ ज्ञात समस्याएं हैं तो यह सलाह समझ में आ सकती है, लेकिन सामान्य सलाह के रूप में यदि आप एक रिलेशनल डेटाबेस का उपयोग कर रहे हैं तो यह बहुत भ्रामक है। उस ने कहा कि गैर-रिलेशनल स्टोरेज तंत्र अधिक लोकप्रिय हो रहे हैं अमेज़ॅन की सरल डीबी और कॉच डीबी (couchdb.apache.org) उदाहरण हैं। यदि आप के पीछे संबंधपरक मॉडल छोड़कर बेहतर सेवा दी जाती है तो शायद उन उत्पादों को छोड़ दें जो पीछे भी के लिए अनुकूल हैं और अन्य उपकरणों की तलाश में हैं। - Tendayi Mawushe


लेख में कहा गया है कि जुड़ने की अनुपस्थिति की तुलना में वे धीमी हैं। यह denormalization के साथ हासिल किया जा सकता है। तो गति और सामान्यीकरण के बीच एक व्यापार बंद है। समयपूर्व अनुकूलन के बारे में भी मत भूलना :)


12
2018-04-12 17:08



यहां तक ​​कि यह एक कठिन नियम नहीं है, यदि आप किसी तालिका में शामिल होते हैं, तो MySQL एक शामिल होने के लिए एक इंडेक्स का उपयोग कर सकता है - उस इंडेक्स में शामिल होने से कई पंक्तियां और तालिकाओं पर किसी भी खंड के लिए एक और अनुक्रमणिका हो सकती है। यदि आप शामिल नहीं होते हैं, तो MySQL आमतौर पर केवल एक अनुक्रमणिका का उपयोग करेगा (जो कि सबसे कुशल नहीं हो सकता है), इससे कोई फर्क नहीं पड़ता कि आपका क्लॉज कैसे बनाया गया है। - leeeroy


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

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

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

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

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

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

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

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

तो हम कहां संतुलन करते हैं? कोई भी सर्वश्रेष्ठ जवाब नहीं है। सभी बेहतर उत्तरों संरचना रखरखाव की आसानी, डेटा रखरखाव में आसानी और कोड निर्माण / रखरखाव की आसानी के बीच कुछ समझौता करते हैं। सामान्य रूप से, डेटा की कम डुप्लिकेशंस, बेहतर।

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

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


10
2018-04-13 01:00





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

Denomalize नहीं करने के कई कारण हैं। सबसे पहले, चुनिंदा प्रश्नों की गति डाटाबेस के साथ एकमात्र या यहां तक ​​कि मुख्य चिंता नहीं है। डेटा की ईमानदारी पहली चिंता है। यदि आप denormalize तो माता-पिता डेटा परिवर्तन के रूप में डेटा को denormalized रखने के लिए आपको जगह तकनीकों में डाल देना होगा। तो मान लीजिए कि आप ग्राहक_आईडी पर क्लाइंट टेबल में शामिल होने के बजाय सभी तालिकाओं में क्लाइंट नाम संग्रहीत करने के लिए लेते हैं। अब जब ग्राहक का नाम बदलता है (100% मौका ग्राहकों के नामों में से कुछ समय के साथ बदल जाएगा), अब आपको उस परिवर्तन को दर्शाने के लिए सभी बच्चे के रिकॉर्ड अपडेट करने की आवश्यकता है। यदि आप इसे एक कैस्केड अपडेट करते हैं और आपके पास लाखों बच्चे के रिकॉर्ड हैं, तो आप कितनी तेजी से मानते हैं कि यह कितना तेज़ होगा और कितने उपयोगकर्ता लॉकिंग मुद्दों और उनके काम में देरी होने के दौरान परेशान होने जा रहे हैं? अधिकतर लोग जो denormalize क्योंकि "जॉइन धीमे हैं" डेटाबेस के बारे में पर्याप्त जानकारी नहीं है यह सुनिश्चित करने के लिए पर्याप्त है कि उनकी डेटा अखंडता सुरक्षित है और अक्सर उन डेटाबेस के साथ समाप्त होती है जिनके पास अयोग्यता है क्योंकि अखंडता इतनी खराब है।

Denormalization एक जटिल प्रक्रिया है जिसके लिए डेटाबेस प्रदर्शन और अखंडता की पूरी तरह से समझदारी की आवश्यकता है यदि यह सही ढंग से किया जाना है। जब तक आपके पास कर्मचारियों पर ऐसी विशेषज्ञता न हो, तब तक denormalize करने का प्रयास न करें।

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

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


9
2018-04-12 17:44





अगर शामिल हो तो धीमे हो जाते हैं

  • डेटा अनुचित अनुक्रमित है
  • परिणाम खराब फ़िल्टर
  • क्वेरी में शामिल होने से खराब लिखा गया
  • डेटा बहुत बड़ा और जटिल सेट करता है

तो, सच है, आपका डेटा जितना अधिक प्रोसेसिंग आपको एक क्वेरी के लिए आवश्यक करेगा, लेकिन उपरोक्त के पहले तीन विकल्पों पर जांच और काम करने से अक्सर अच्छे परिणाम मिलेंगे।

आपका स्रोत एक विकल्प के रूप में denormalization देता है। यह तब तक ठीक है जब तक आप बेहतर विकल्प समाप्त कर चुके हैं।


8
2018-04-12 17:13





यदि प्रत्येक पक्ष के रिकॉर्ड के बड़े हिस्से स्कैन किए जाने की आवश्यकता है तो जॉइन धीमा हो सकता है।

इस कदर:

SELECT  SUM(transaction)
FROM    customers
JOIN    accounts
ON      account_customer = customer_id

यहां तक ​​कि अगर एक सूचकांक पर परिभाषित किया गया है account_customer, बाद के सभी अभिलेखों को अभी भी स्कैन करने की आवश्यकता है।

क्वेरी सूची के लिए, सभ्य अनुकूलक शायद इंडेक्स एक्सेस पथ पर भी विचार नहीं करेंगे, एक कर रहे हैं HASH JOIN या ए MERGE JOIN बजाय।

ध्यान दें कि इस तरह की एक क्वेरी के लिए:

SELECT  SUM(transaction)
FROM    customers
JOIN    accounts
ON      account_customer = customer_id
WHERE   customer_last_name = 'Stellphlug'

शामिल होने वाला शायद सबसे तेज़ होगा: पहला, एक सूचकांक customer_last_name सभी Stellphlug (जो निश्चित रूप से, बहुत अधिक नहीं हैं) फ़िल्टर करने के लिए इस्तेमाल किया जाएगा, फिर एक सूचकांक स्कैन account_customer अपने लेनदेन को खोजने के लिए प्रत्येक स्टाइलफ्लग के लिए जारी किया जाएगा।

इस तथ्य के बावजूद कि ये अरबों रिकॉर्ड हो सकते हैं accounts तथा customers, केवल कुछ ही स्कैन किए जाने की आवश्यकता होगी।


7
2018-04-12 17:07



लेकिन इससे बचना मुश्किल है। अपने ऐप को डिज़ाइन करें ताकि इस तरह के प्रश्नों को अक्सर निष्पादित नहीं किया जाता है। - Andrey
अगर एक सूचकांक पर परिभाषित किया गया है accounts(account_customer) अधिकांश आरडीबीएमएस इस सूचकांक का उपयोग करेंगे कि यह पता लगाने के लिए कि कौन सी पंक्तियां हैं customers डेटाबेस स्कैन किया जाना चाहिए। - jemfinch
हाँ, लेकिन यह वैसे भी सस्ता ऑपरेशन नहीं है। आप कुछ फ़ील्ड में योग स्टोर कर सकते हैं और प्रत्येक लेनदेन में अपडेट कर सकते हैं। - Andrey
@jemfinch: नहीं, वे नहीं करेंगे। इसके लिए ग्राहकों को फ़िल्टर करने के लिए पूरी इंडेक्स स्कैनिंग की आवश्यकता होगी, फिर ग्राहक के इंडेक्स को नेस्टेड लूप में स्कैन करना होगा। ए HASH JOIN बहुत तेज़ होगा इसलिए छोड़कर सभी प्रमुख डेटाबेस को छोड़कर इसका उपयोग किया जाएगा MySQL, जो सिर्फ बना देगा customers एक नेस्टेड पाश में अग्रणी (क्योंकि यह आकार में छोटा है) - Quassnoi


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

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

एक बार आपका परिणाम सेट बढ़ने लगने के बाद, चीजें धीमी होने जा रही हैं। उसी उदाहरण का उपयोग करते हुए, यदि प्राथमिक तालिका 100K रिकॉर्ड में परिणाम देती है, तो वहां 500K "शामिल" रिकॉर्ड होंगे जिन्हें खोजने की आवश्यकता है। देरी जोड़ने के साथ डेटाबेस से बस इतना डेटा खींच रहा है।

जॉइन से बचें, बस पता करें कि डेटासेट को "बहुत बड़ा" होने पर आपको ऑप्टिमाइज़ / डिमॉर्मलाइज़ करने की आवश्यकता हो सकती है।


3
2018-04-12 17:45





जुड़ने को स्केलेबिलिटी के लिए एक विरोधी बल माना जाता है क्योंकि वे आम तौर पर बाधा होती हैं और उन्हें आसानी से वितरित या समान नहीं किया जा सकता है।


2
2018-04-12 17:09



मुझे यकीन नहीं है कि यह सच है। मुझे पता है कि टेराडाटा निश्चित रूप से एएमपीएस के बीच जुड़ने में सक्षम है। स्पष्ट रूप से कुछ प्रकार के जुड़ने वाले दूसरों की तुलना में अधिक कठिन / अचूक हो सकते हैं। - Cade Roux
इंडेक्स को आरएसबीएमएस में विभाजित किया जा सकता है जो mysql से oracle तक है। AFAIK कि तराजू (वितरित और समान हो सकता है)। - Unreason


उपयुक्त इंडस्ट्रीज और सही ढंग से लिखित प्रश्नों के साथ उचित रूप से डिज़ाइन की गई तालिकाएं हमेशा धीमी नहीं होती हैं। आपने कभी यह सुना है कि:

बुरे या 'धीमे' क्यों शामिल हो रहे हैं

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


2
2018-04-12 17:09