प्रदर्शन में सुधार करने के लिए असामान्य? यह पक्का लगता है, लेकिन इसमें पानी नहीं है।
क्रिस टेड, जो डॉ। टेड कॉड के साथ कंपनी में थे, संबंधपरक डेटा मॉडल के मूल प्रस्तावक थे, सामान्यीकरण के खिलाफ गलत तर्क के साथ धैर्य से भाग गए और वैज्ञानिक पद्धति का उपयोग करके उन्हें व्यवस्थित रूप से ध्वस्त कर दिया: उन्होंने बड़े डेटाबेस प्राप्त किए और अपने दावे का परीक्षण किया ।
मुझे लगता है कि वह में यह लिखा रिलेशनल डेटाबेस लेखन 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
डिस्क को बहुत अधिक हिट करने का कारण बनता है, लेकिन समतुल्य "डिनोमिनेटेड" स्कीमा को डिस्क को हिट नहीं करना होगा, तो पुनरावृत्ति प्रदर्शन प्रतियोगिता जीतता है।
मूल लेखक से टिप्पणी: आधुनिक डेटाबेस इंजन शामिल होने के दौरान कैश मिस को कम करने के लिए एक्सेस सीक्वेंसिंग के आयोजन में बहुत अच्छे हैं। उपरोक्त, जबकि सच है, गर्भपात के रूप में लगाया जा सकता है कि बड़े डेटा पर अनिवार्य रूप से महंगा होने के कारण जुड़ जाते हैं। यह अनुभवहीन डेवलपर्स की ओर से खराब निर्णय लेने का कारण होगा।