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


92

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

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

स्रोत

मुझे हमेशा लगता था कि वे पीके की तलाश करते हुए विशेष रूप से तेज थे। वे 'धीमे' क्यों हैं?

sql  join 

जवाबों:


98

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

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

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

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

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

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

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

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

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


14
सूचियों को संभवतः सूची में सबसे ऊपर होना चाहिए। बहुत से ( खाँसी ) डेवलपर्स एक छोटे डेटा सेट पर परीक्षण करते समय उनके बारे में भूल जाते हैं और फिर उत्पादन में अपने घुटनों पर डेटाबेस लाते हैं। मैंने ऐसे प्रश्नों को देखा है जो केवल अनुक्रमित जोड़कर 100,000 गुना तेजी से क्रम में चलते हैं। और यह कि बिना किसी पूर्व-गहन डेटा विश्लेषण के मनमाने अनुक्रमणिका हैं, जो कि वाम-पूर्व उपसर्ग मिलान के लिए सबसे अच्छा मिश्रण निर्धारित करते हैं।
डंकन

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

अपने तीसरे आइटम में, आप "भौतिक / अनुक्रमित विचारों" का उल्लेख करते हैं। क्या आप नियमित एसक्यूएल विचारों, या कुछ और के बारे में बात कर रहे हैं?
slolife

@slolife नियमित एसक्यूएल दृश्य मक्खी पर पृष्ठभूमि में एक अतिरिक्त क्वेरी चलाने की तरह है जब आप एक क्वेरी का उपयोग करते हैं जो दृश्य को संदर्भित करता है। लेकिन आप कुछ विचारों को "भौतिक" करने के लिए एसक्यूएल सर्वर को भी बता सकते हैं। जब आप ऐसा करते हैं, तो sql सर्वर एक नियमित तालिका की तरह, दृश्य के डेटा की एक अतिरिक्त प्रतिलिपि रखेगा, जैसे कि जब आप किसी क्वेरी में दृश्य का संदर्भ देते हैं तो उसे अब इस क्वेरी को पृष्ठभूमि में नहीं चलाना होगा क्योंकि डेटा पहले से ही है । आप प्रदर्शन तालिका को आगे बढ़ाने में मदद करने के लिए स्रोत तालिका की तुलना में अलग-अलग इंडेक्स भी डाल सकते हैं।
जोएल कोएहॉर्न

धन्यवाद जोएल। मुझे उस पर गौर करना होगा।
सुस्ती

29

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

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


2
... MySQL को छोड़कर, जिसमें बड़ी संख्या में जॉइन के साथ परफॉर्मेंस प्रॉब्लम होती है, भले ही आपके इंडेक्स कैसे दिखते हों। या कम से कम यह अतीत में है।
पॉवरलॉर्ड

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

13

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


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

11

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

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

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

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

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

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

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

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

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

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

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


10

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

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

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

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

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


8

जॉइन करने पर धीमे होते हैं

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

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

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


7

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

ऐशे ही:

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उपयोग सभी स्टेलफ्लग (जो निश्चित रूप से बहुत अधिक नहीं हैं) को फ़िल्टर करने के लिए किया जाएगा, फिर एक सूचकांक स्कैन परaccount_customer प्रत्येक स्टेलफ्लग के लिए जारी जाएगा ताकि उसके लेनदेन का पता लगाया जा सके।

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


लेकिन इससे बचना मुश्किल है। अपने ऐप को डिज़ाइन करें ताकि इस तरह के प्रश्नों को अक्सर निष्पादित न किया जाए।
एंड्री

1
यदि कोई सूचकांक accounts(account_customer)अधिकांश आरडीबीएमएस पर परिभाषित किया गया है, तो उस सूचकांक का उपयोग यह पता लगाने के लिए customersकिया जाएगा कि डेटाबेस की किन पंक्तियों को स्कैन किया जाना चाहिए।
jemfinch

हाँ, लेकिन यह वैसे भी सस्ता ऑपरेशन नहीं है। आप कुछ फ़ील्ड में राशि जमा कर सकते हैं और प्रत्येक लेनदेन पर अपडेट कर सकते हैं।
एंड्री

@jemfinch: नहीं, वे नहीं करेंगे। इसके लिए ग्राहकों को फ़िल्टर करने के लिए पूरे सूचकांक को स्कैन करना होगा, फिर ग्राहक के सूचकांक को नेस्टेड लूप में स्कैन करना होगा। A HASH JOINबहुत तेज़ होगा इसलिए इसका उपयोग सभी बड़े डेटाबेस को छोड़कर MySQLकिया जाएगा, जो सिर्फ customersनेस्टेड लूप में अग्रणी होगा (क्योंकि यह आकार में छोटा है)
Quassnoi

4

Joins are fast.जोड़ों को एक सामान्य रूप से सामान्यीकृत डेटाबेस स्कीमा के साथ मानक अभ्यास माना जाना चाहिए। जुड़ने से आप डेटा के असमान समूहों को सार्थक तरीके से जोड़ सकते हैं। ज्वाइन से मत डरो।

चेतावनी यह है कि आपको सामान्यीकरण, जुड़ने और अनुक्रमित के उचित उपयोग को समझना चाहिए।

समयपूर्व अनुकूलन से सावधान रहें, क्योंकि सभी विकास परियोजनाओं में नंबर एक की विफलता समय सीमा को पूरा कर रही है। एक बार जब आप इस परियोजना को पूरा कर लेते हैं, और आप व्यापार को समझते हैं, तो आप नियमों को तोड़ सकते हैं यदि आप इसे सही ठहरा सकते हैं।

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

यह भी सच है कि एक पक्षी बिना किसी पंख के तेजी से उड़ता है, लेकिन केवल सीधे नीचे।


3

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

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

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

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


3

आपके द्वारा उद्धृत लेख से भी:

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

तथा

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

तथा

डेटाबेस के यह सब काम करने की तुलना में यह अधिक त्रुटि वाला है, लेकिन आप पिछले स्तर पर ऐसा करने में सक्षम हैं जो उच्चतम अंत डेटाबेस भी संभाल सकते हैं।

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


2

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


मुझे यकीन नहीं है कि यह सच है। मुझे पता है कि Teradata निश्चित रूप से Amps के बीच जुड़ाव वितरित करने में सक्षम है। स्पष्ट रूप से कुछ प्रकार के जोड़ दूसरों की तुलना में पेचीदा / अचूक हो सकते हैं।
केडे रूक्स

अनुक्रमित RDBMS में mysql से लेकर oracle तक विभाजित किए जा सकते हैं। AFAIK जो तराजू है (वितरित किया गया है और समान हो सकता है)।
अनरसन

2

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

क्यों बुरे या 'धीमे' से जुड़ते हैं

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


1

जो अस्थायी डेटा उत्पन्न होता है वह जॉन्स के आधार पर बहुत बड़ा हो सकता है।

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

मुझे खोज संग्रहीत प्रक्रिया का अनुकूलन करने का काम सौंपा गया था।

पहली चीज़ जो मैंने की थी अगर मुख्य तालिका के किसी भी क्षेत्र को खोजा जा रहा था, तो मैंने उन क्षेत्रों पर केवल एक अस्थायी तालिका का चयन किया। फिर, मैं बाकी खोज करने से पहले उस टेम्‍प टेबल के साथ सभी तालिकाओं में शामिल हो गया। खोज जहां मुख्य टेबल फ़ील्ड में से एक अब 10 सेकंड से कम समय लेती है।

यदि मुख्य टेबल क्षेत्रों में से कोई भी खोज शुरू नहीं हुई है, तो मैं अन्य तालिकाओं के लिए समान अनुकूलन करता हूं। जब मैं किया गया था, तो कोई भी खोज 10 सेकंड से अधिक के साथ 30 सेकंड से अधिक नहीं लेती है।

SQL सर्वर का CPU उपयोग भी WAY DOWN गया।


@BoltBait: क्या वह संदेश है जिससे आपको जुड़ने से पहले हमेशा पंक्तियों की संख्या कम करने की कोशिश करनी चाहिए?
अनटुब

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

आम तौर पर जॉन्स (चयनात्मकता पर उपलब्ध स्मृति के आधार पर, बफ़र्स में शामिल होने की स्मृति और आकार) के आधार पर कोई अस्थायी डेटा उत्पन्न नहीं होता है; हालाँकि, अस्थायी डेटा आमतौर पर ऑर्डर द्वारा अलग-अलग बनाया जाता है और अगर कोई ऐसा इंडेक्स नहीं है जो इस तरह के ऑपरेशन के लिए इस्तेमाल किया जा सके।
अनरसन

1

हालांकि, जुड़ता है (संभवतः एक सामान्यीकृत डिज़ाइन के कारण) स्पष्ट रूप से डेटा पुनर्प्राप्ति के लिए एक तालिका से पढ़े जाने की तुलना में धीमा हो सकता है, एक असामान्य डेटाबेस डेटा निर्माण / अपडेट संचालन के लिए धीमा हो सकता है क्योंकि समग्र लेनदेन के पदचिह्न न्यूनतम नहीं होंगे।

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


1

ठीक है, हाँ, एक अपभ्रंश तालिका से पंक्तियों का चयन करना (अपनी क्वेरी के लिए सभ्य अनुक्रमित करना) तेज हो सकता है कि कई तालिकाओं में शामिल होने से निर्मित पंक्तियों का चयन करना, खासकर अगर जोड़ों में कुशल अनुक्रमणिका उपलब्ध न हों।

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

अधिकांश अनुप्रयोगों - फिर से, IMO - RDBMS द्वारा प्रदान किए गए सत्यापन और कम किए गए दोहराव से लाभ।


0

यदि ढलान किया जाए तो वे धीमे हो सकते हैं। उदाहरण के लिए, यदि आप किसी ज्वाइन पर 'सेलेक्ट * करते हैं तो आप सामान को वापस पाने के लिए थोड़ी देर करेंगे। हालांकि, यदि आप ध्यान से चुनते हैं कि प्रत्येक तालिका से क्या कॉलम वापस आना है, और जगह में उचित अनुक्रमित होने के साथ, कोई समस्या नहीं होनी चाहिए।

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