2009-10-27 15 views
8

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

उत्तर

4

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

एमएस Sql सर्वर के लिए आप पृष्ठों को समझने के साथ शुरू करने के लिए चाहते हो सकता है - भंडारण की मूलभूत इकाई अंकों की संख्या देखते हैं (देखें http://msdn.microsoft.com/en-us/library/ms190969.aspx)

बनाम चर भंडारण प्रकार फिक्स के प्रदर्शन निहितार्थ के संदर्भ में प्रदर्शन पर विचार करने के लिए:

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

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

इस बिंदु पर मैं कुछ और अंतर्दृष्टि के लिए उत्कृष्ट पुस्तक "माइक्रोसॉफ्ट एसक्यूएल सर्वर 2008 आंतरिक" की सिफारिश करने जा रहा हूं कि इस तरह की जटिल चीजें वास्तव में कैसे मिलती हैं!

7

आप अपने प्रश्न में बहुत सारी धारणाएं करते हैं जो आवश्यक नहीं हैं।

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

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

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

+0

+1: प्रश्न भी एक महत्वपूर्ण मात्रा में अद्यतन मानता है जो VARCHAR फ़ील्ड का विस्तार करता है। यहां तक ​​कि यह भी हो सकता है - कुछ अनुप्रयोगों में - पंक्तियों का एक विलुप्त रूप से छोटा प्रतिशत। –

+0

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

+0

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

3

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

2

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

जैसा कि आपने सुझाव दिया है, यह देखना दिलचस्प होगा कि क्या होता है यदि आप रिक्त स्ट्रिंग ("") के साथ सभी रिकॉर्ड्स डालें और फिर उन 100 अक्षरों को अपडेट करें जो उचित रूप से यादृच्छिक हैं, न केवल 100 एक्सएस।

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

+0

SQLite डेटा के लिए स्टोरेज तंत्र को नहीं जानते, ऊपर, मेरी टिप्पणी में जो कह रहा था उसका एक आदर्श उदाहरण है। हुड के तहत, SQLite में टाइप किए गए संग्रहण भी नहीं हैं - आप किसी भी कॉलम प्रकार (यहां तक ​​कि INTEGER) में VARCHAR- जैसे डेटा डाल सकते हैं। –

+0

सवाल यह है कि क्या यह प्रदर्शन के लिए कोई फर्क पड़ता है? केवल एक परीक्षण निश्चित रूप से बताएगा। एक बात के लिए, सॉफ्टवेयर डेवलपर्स ने विखंडन की संभावना को महसूस किया होगा और इसे किसी तरह से कम कर दिया है। दूसरे के लिए, निश्चित लंबाई वर्णों के अतिरिक्त पैडिंग से अधिक फ़ाइल I/O का कारण बन जाएगा, लेकिन यह भी कम हो सकता है। यह जानने के लिए कि क्या कोई महत्वपूर्ण अंतर है, आपको भिन्नताओं को बेंचमार्क करना होगा। –

1

एसक्यूएल सर्वर वर्कर (वर्कर (MAX) को छोड़कर) आम तौर पर शेष पंक्ति के डेटा के साथ एक साथ संग्रहीत किया जाता है (उसी पृष्ठ पर यदि पंक्ति का डेटा < 8KB है और उसी हद तक यदि यह < 64KB है टेक्स्ट, एनआईआर, इमेज, वर्कर (MAX), एनवीएआरएचएआरएआर (MAX), एक्सएमएल और वर्बिनरी (MAX) जैसे बड़े डेटा प्रकार अलग-अलग संग्रहित होते हैं।

2

यह पूरी तरह से डेटाबेस विशिष्ट होने जा रहा है।

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

संबंधित मुद्दे