डेटाबेस कब और क्यों महंगे होते हैं?


354

मैं डेटाबेस में कुछ शोध कर रहा हूं और मैं रिलेशनल डीबी की कुछ सीमाओं को देख रहा हूं।

मुझे लग रहा है कि बड़ी टेबलों के जोड़ बहुत महंगे हैं, लेकिन मुझे पूरी तरह यकीन नहीं है कि क्यों। जॉइंट ऑपरेशन को अंजाम देने के लिए DBMS को क्या करना होगा, कहां अड़चन है?
इस खर्च को दूर करने में विकृतीकरण कैसे मदद कर सकता है? अन्य अनुकूलन तकनीकें (अनुक्रमणिका, उदाहरण के लिए) कैसे मदद करती हैं?

व्यक्तिगत अनुभवों का स्वागत है! यदि आप संसाधनों के लिंक पोस्ट करने जा रहे हैं, तो कृपया विकिपीडिया से बचें। मुझे पता है कि वह पहले से ही कहां है।

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


3
क्या आप भी लाभ देख रहे हैं? ;)
डेविड एल्ड्रिज

मैं एक उद्देश्य में देख रहा हूँ (अगर ऐसी कोई बात है) तुलना। Pro's, con's, what-have-you है।
Rik

क्लाउड कंप्यूटिंग के पूर्व-प्रदत्त दृष्टिकोण "गलत जुड़ाव" समस्या से बचने के लिए हर तरह से दांव लगाने में सक्षम हैं। Google के पास अपने स्वयं के सिस्टम पर कुछ श्वेतपत्र हैं। काफी दिलचस्प - विशेष मामलों की प्रयोज्यता को बढ़ाने के तरीके।
पीटर

@PeterWone - उन पेपर्स में से कुछ का संदर्भ प्रदान करने के लिए देखभाल? अपने प्रोफ़ाइल के प्रश्न का उत्तर देने के लिए, Android ओपन सोर्स है - ठीक है, कम से कम आंशिक रूप से, इसलिए गीक्स उस बैंडगैगन पर कूद गए। तकनीकी रूप से महान अनजाने से उन्नत के रूप में देखा गया था, उन्हें Google के तंग और पसीने से भरे आलिंगन में देखा गया था! बेटमैक्स कोई? मेरे खुद के दिल (और पीढ़ी) के करीब, MySQL (बिना FOREGIN KEYs FFS के) कैसे बन गया (और बना रहेगा) दुनिया का सबसे लोकप्रिय "R" DBMS है जब इसका मुकाबला PostgreSQL (कोई देशी विंडोज संस्करण) और फायरबर्ड (Opensourcing fiasco) से नहीं था , या यहां तक ​​कि SQLite?
वेयर्स

अनावश्यक कहने के लिए, मैं PostgreSQL और Firebird के रूप में मानते बेहद बेहतर MySQL करने के लिए बहु उपयोगकर्ता सिस्टम और SQLite के लिए तारकीय के रूप में एक उपयोगकर्ता के क्षेत्र में। SQLite sqlite.org साइट को संभालती है (एक दिन में 400,00 हिट!)।
वेअर

जवाबों:


470

प्रदर्शन में सुधार करने के लिए असामान्य? यह पक्का लगता है, लेकिन इसमें पानी नहीं है।

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

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

उन्होंने पाया कि:

  • उनमें से कुछ विशेष मामलों के लिए पकड़ रखते हैं
  • वे सभी सामान्य उपयोग के लिए भुगतान करने में विफल रहते हैं
  • उनमें से सभी अन्य विशेष मामलों के लिए काफी खराब हैं

यह सब काम करने वाले सेट के आकार को कम करने के लिए वापस आता है। सही ढंग से सेट किए गए अनुक्रमित के साथ ठीक से चयनित कुंजियों को शामिल करना सस्ता है, महंगा नहीं है, क्योंकि वे पंक्तियों के भौतिक होने से पहले परिणाम की महत्वपूर्ण छंटाई की अनुमति देते हैं।

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

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

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

यह समझना महत्वपूर्ण है कि टेबल स्कैन (जॉइन करने के दौरान टेबल में प्रत्येक पंक्ति की परीक्षा) दुर्लभ हैं। एक क्वेरी ऑप्टिमाइज़र केवल एक टेबल स्कैन का चयन करेगा जब निम्नलिखित में से एक या अधिक धारण करेगा।

  • संबंध में 200 से कम पंक्तियाँ हैं (इस मामले में एक स्कैन सस्ता होगा)
  • जॉइन कॉलम पर कोई उपयुक्त इंडेक्स नहीं हैं (यदि इन कॉलम में शामिल होने के लिए यह सार्थक है तो वे अनुक्रमित क्यों नहीं हैं? इसे ठीक करें?)
  • स्तंभों की तुलना किए जाने से पहले एक प्रकार का जोर लगाना आवश्यक है (WTF? इसे ठीक करें या घर जाएं) ADO.NET ISSUE के लिए SEE END NOTES
  • तुलना के तर्कों में से एक अभिव्यक्ति है (कोई सूचकांक नहीं)

ऑपरेशन न करना, प्रदर्शन न करने से अधिक महंगा है। हालांकि, गलत संचालन का प्रदर्शन , व्यर्थ डिस्क I / O में मजबूर किया जा रहा है और फिर इससे पहले कि आप वास्तव में जरूरत में शामिल होने के प्रदर्शन के लिए सकल को छोड़ दें, और अधिक महंगा है। यहां तक ​​कि जब "गलत" ऑपरेशन प्रीकम्प्यूटेड है और इंडेक्स को समझदारी से लागू किया गया है, तो महत्वपूर्ण जुर्माना रहता है। अपॉइंटमेंट को शामिल करने के लिए असमानता - अपडेट की गई विसंगतियों के बावजूद - किसी विशेष जॉइन के लिए प्रतिबद्धता है। यदि आपको एक अलग जुड़ाव की आवश्यकता है , तो यह प्रतिबद्धता आपको बड़ी लागत देने वाली है ।

अगर कोई मुझे याद दिलाना चाहता है कि यह एक बदलती दुनिया है, तो मुझे लगता है कि आपको ग्रंटियर हार्डवेयर पर बड़े डेटासेट बस डेट के निष्कर्षों को फैलाने में अतिरंजित करते हैं।

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

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

मैं भी जवाब देना चाहूंगा

कुछ लिपग्लॉस के साथ जोड़ सिर्फ कार्टेशियन उत्पाद हैं

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

जिस तरह से आप कभी भी एक कार्तीय उत्पाद बनाने के लिए ऑप्टिमाइज़र प्राप्त करेंगे, वह एक विधेय की आपूर्ति करने में विफल रहता है: SELECT * FROM A,B


टिप्पणियाँ


डेविड एल्ड्रिज कुछ महत्वपूर्ण अतिरिक्त जानकारी प्रदान करता है।

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

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

मैं MSSQL अनुकूलक की तुलना में अधिक स्मार्ट हुआ करता था। वह दो संस्करण पहले बदल गया। अब यह आम तौर पर मुझे सिखाता है । यह एक बहुत ही वास्तविक अर्थों में, एक विशेषज्ञ प्रणाली है, एक डोमेन में कई बहुत चतुर लोगों के सभी ज्ञान को पर्याप्त रूप से बंद करके एक नियम-आधारित प्रणाली प्रभावी है।


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

जिस कारण से मैंने इतनी शिद्दत से जवाब दिया वह यह था कि जैसा शब्द कहा गया है वैसा ही कथन है

में शामिल हैं कार्तीय उत्पादों ...

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

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


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


कभी-कभी वंचना एक अच्छा विचार है

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

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

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

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

अपने OLTP डेटाबेस (जिस पर डेटा प्रविष्टि होती है) डेटाबेस को अपकृत करने की गलती न करें। यह बिलिंग रन के लिए तेज़ हो सकता है लेकिन यदि आप ऐसा करते हैं तो आपको अपडेट विसंगतियाँ मिलेंगी। कभी आपको सामान भेजने से रोकने के लिए रीडर्स डाइजेस्ट प्राप्त करने की कोशिश की गई है?

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


प्रकार बेमेल के साथ ADO.NET समस्या

मान लें कि आपके पास SQL ​​सर्वर तालिका है जिसमें प्रकार varchar का अनुक्रमित स्तंभ है, और आप इस स्तंभ पर क्वेरी को बाध्य करने वाले पैरामीटर को पास करने के लिए AddWithValue का उपयोग करते हैं। C # स्ट्रिंग्स यूनिकोड हैं, इसलिए अनुमानित पैरामीटर प्रकार NVARCHAR होगा, जो VARCHAR से मेल नहीं खाता है।

VARCHAR से NVARCHAR एक व्यापक रूपांतरण है, इसलिए यह संक्षेप में होता है - लेकिन अनुक्रमण को अलविदा कहो, और सौभाग्य क्यों काम कर रहा है।


"डिस्क हिट्स गिनें" (रिक जेम्स)

यदि सब कुछ रैम में कैश किया गया है, JOINsबल्कि सस्ते हैं। यही है, सामान्यीकरण में बहुत अधिक निष्पादन जुर्माना नहीं है ।

यदि एक "सामान्यीकृत" स्कीमा JOINsडिस्क को बहुत अधिक हिट करने का कारण बनता है, लेकिन समतुल्य "डिनोमिनेटेड" स्कीमा को डिस्क को हिट नहीं करना होगा, तो पुनरावृत्ति प्रदर्शन प्रतियोगिता जीतता है।

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


7
इन बयानों का सोनमे एक विशेष DBMS के लिए विशिष्ट है, वे नहीं हैं? जैसे। "संबंध में 200 से कम पंक्तियाँ हैं"
डेविड एल्ड्रिज

2
क्या सरोगेट कुंजी का उपयोग (या नहीं) यह सब काफी प्रभावित करता है?
डेविड प्लम्पटन

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

7
यह भी मत भूलो कि कई NoSQL डेटाबेस अनिवार्य रूप से वही डेटाबेस हैं जिन्हें हमने 40 साल पहले त्याग दिया था। युवा हमेशा सोचते हैं कि उन्होंने कुछ नया खोजा है। फैबियन पास्कल: dbdebunk.com/2014/02/thinking-logically-sql-nosql-and.html
N West

3
आक्रामक। यह एक अच्छा खाता था, लेकिन आक्रामकता और सूक्ष्म-आक्रामकता सामग्री, या सामग्री के मूल्य में जोड़ नहीं है।
MrMesees

46

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

किसी भी मामले में, शामिल होने की लागत इसके प्रकार और कुछ अन्य कारकों पर निर्भर करती है। यह बिल्कुल भी महंगा नहीं होना चाहिए - कुछ उदाहरण।

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

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


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

2
हम्म, मेरे विनम्र अनुभव में बहुत सारे डीबीए ऐसे हैं, जिन्होंने कभी भी हैश ज्वाइन के बारे में नहीं सुना है, या सोचते हैं कि वे एक यूनिवर्सिटी बैड थिंग हैं।
डेविड एल्ड्रिज

28

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

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

जब ठीक से किया जाता है, तो आम तौर पर बड़ी मात्रा में डेटा की तुलना, संयोजन, या फ़िल्टर करने का सबसे अच्छा तरीका होता है।


1
@joel। इसका उलटा भी सच है। बड़े डेटासेट जोड़ महंगे हो सकते हैं और कभी-कभी आवश्यक होते हैं, लेकिन आप इसे बहुत बार नहीं करना चाहते हैं जब तक कि क) आप आवश्यक IO और RAM को संभाल नहीं सकते हैं और b) आप इसे अक्सर नहीं कर रहे हैं। भौतिक विचारों, रिपोर्टिंग प्रणालियों, रीयलटाइम बनाम सीओबी रिपोर्टों पर विचार करें।
गाइ

11

अड़चन बहुत ज्यादा हमेशा डिस्क I / O है, और इससे भी अधिक विशेष रूप से - यादृच्छिक डिस्क I / O (तुलनात्मक रूप से, अनुक्रमिक रीड काफी तेज हैं और आगे की रणनीतियों को पढ़ने के साथ कैश किया जा सकता है)।

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

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

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

एक साथ एक ही ओवरहेड के बारे में मिलान पंक्तियों का पता लगाने से आता है। Sql Server मुख्य रूप से डेटासेट आकार के आधार पर, मेल खाने वाली पंक्तियों को खोजने के लिए 3 विभिन्न प्रकार के जॉइन का उपयोग करता है। यदि ऑप्टिमाइज़र गलत तरीके से जुड़ता है (गलत आँकड़ों के कारण, अपर्याप्त अनुक्रमित, या बस एक ऑप्टिमाइज़र बग या किनारे का मामला) तो यह क्वेरी समय को काफी प्रभावित कर सकता है।

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

इष्टतम मामले में, ये कोई डिस्क I / O का कारण नहीं हैं और इसलिए प्रदर्शन के दृष्टिकोण से नगण्य हैं।

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

चूँकि क्वेरी का समय आमतौर पर I / O लागतों पर हावी होता है, और आपके डेटा का आकार नहीं बदलता है (शून्य से कुछ अतिवृष्टि पंक्ति उपरिव्यय), विकृति के साथ, केवल एक साथ तालिकाओं के विलय से होने वाले लाभ की एक जबरदस्त मात्रा नहीं है। प्रदर्शन को बढ़ाने के लिए जिस प्रकार के भाज्यीकरण का उपयोग किया जाता है, आईएमई उन्हें गणना करने के लिए आवश्यक 10,000 पंक्तियों को पढ़ने के बजाय गणना मूल्यों को कैशिंग कर रहा है।


रैंडम सीक्स को कम करना: अच्छी बात है, हालांकि एक बड़ा RAID कंट्रोलर के साथ एक अच्छा RAID कंट्रोलर रीड / राइटिंग करेगा।
पीटर वॉन

3

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

कुछ डेटाबेस के लिए यह कोई फर्क नहीं पड़ता है, उदाहरण के लिए MS SQL अधिकांश समय उचित जॉइन ऑर्डर को जानता है। कुछ के लिए (आईबीएम इंफॉर्मिक्स की तरह) ऑर्डर में सभी अंतर हैं।


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

5
MySQL, Oracle, SQL Server, Sybase, postgreSQL, आदि। देखभाल नहीं जुड़ने का क्रम। मैंने DB2 के साथ काम किया है और यह भी, मेरी जानकारी के लिए, परवाह नहीं है कि आपने उन्हें किस क्रम में रखा है। यह सामान्य मामले में उपयोगी सलाह नहीं है
मैट रोजिश

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

@ आईए, यह समझें कि ऑप्टिमाइज़र क्या चुनेंगे, सामान्यीकृत बयानों या "मिथकों" से अधिक महत्वपूर्ण है टेबल ऑर्डरिंग। अपने SQL में किसी विशेष क्विक पर निर्भर न करें क्योंकि RDBMS अपग्रेड होने पर व्यवहार अक्सर बदल जाता है। V7 से Oracle ने कई बार व्यवहार बदले हैं।
गाइ

1
@Matt मैंने देखा है कि Oracle 9i बहुत अलग अनुकूलन और क्वेरी प्लान करता है बस जॉइन ऑर्डर को समायोजित करता है। शायद यह संस्करण 10i के बाद से बदल गया है?
कैमिलो डिआज रेपाका

0

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

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

समस्याओं के व्यापक होने के बाद से सामान्यीकरण और नामकरण की बहस खत्म नहीं हो रही है। ऐसी कई समस्याएं हैं जहां प्राकृतिक समाधान के लिए दोनों दृष्टिकोणों की आवश्यकता होती है।

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


-8

दूसरों ने जो कहा है, उसे विस्तृत करते हुए,

कुछ लिपग्लॉस के साथ जोड़ सिर्फ कार्टेशियन उत्पाद हैं। {1,2,3,4} X {1,2,3} हमें 12 संयोजन देगा (nXn = n ^ 2)। यह गणना सेट एक संदर्भ के रूप में कार्य करता है जिस पर शर्तें लागू की जाती हैं। DBMS उन शर्तों को लागू करता है (जैसे जहां बाएं और दाएं दोनों 2 या 3 हैं) हमें मिलान की स्थिति प्रदान करने के लिए। वास्तव में यह अधिक अनुकूलित है लेकिन समस्या समान है। सेट के आकार में परिवर्तन से परिणाम का आकार तेजी से बढ़ेगा। सभी खपत की गई मेमोरी और सीपीयू चक्र की मात्रा घातीय शब्दों में प्रभावित होती है।

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


3
-1: यह पोस्ट इस बात का एक बड़ा उदाहरण है कि आपने DBMS को क्यों शामिल होने दिया - क्योंकि DBMS डिज़ाइनर हर समय इन मुद्दों के बारे में सोचते हैं और कंपास 101 विधि की तुलना में इसे करने के लिए अधिक प्रभावी तरीके अपनाते हैं।
डेविड एल्ड्रिज

2
@ डेविड: सहमत। DBMS ऑप्टिमाइज़र प्रोग्रामर कुछ स्मार्ट कुकीज़ हैं
मैट रोजिश ऑक्ट

यह उत्तर गलत है। यदि आपकी क्वेरी को एक सामान्यीकृत, अनुक्रमित डेटाबेस के विरुद्ध निष्पादित किया जाता है और इसमें किसी भी प्रकार का फ़िल्टर या शामिल होने की स्थिति होती है, तो ऑप्टिमाइज़र को कार्टेशियन उत्पाद से बचने और स्मृति उपयोग और सीपीयू चक्रों को कम करने का एक तरीका मिलेगा। यदि आप वास्तव में कार्टेशियन उत्पाद का चयन करने का इरादा रखते हैं, तो आप सामान्य या डी-सामान्यीकृत डीबी में उसी मेमोरी का उपयोग करेंगे।
rileymcdowell
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.