2009-03-10 11 views
9

मैं एक टेबल डिज़ाइन पर काम कर रहा हूं जिसमें लगभग 10 फ़ील्ड में कई नल मूल्य शामिल हो सकते हैं, शायद 75% फ़ील्ड अप्रयुक्त किए जाएंगे।एसक्यूएल सर्वर - नल कॉलम के प्रदर्शन/आकार की कमी

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

मुझे पता है कि SQL Server 2008 में स्पैस कॉलम सुविधा है (जो मुझे लगता है कि अगले SharePoint की UserData तालिका पर उपयोग किया जा रहा है)। मैं चाहता हूं कि 2005 में मेरा कोड काम करे। लेकिन वर्तमान SharePoint UserData तालिका के डिज़ाइन में बहुत सारे NULL मान मौजूद हैं। तो यदि यह माइक्रोसॉफ्ट के लिए काफी अच्छा है ...

किसी भी अच्छे लेख, लिंक, श्वेत पत्रों पर कम कागजात या SQL सर्वर तालिका में कई नल मानों के आसपास दर्द बिंदु? किसी के पास कोई अनुभव होता है कि आप 10 मिलियन या 100 मिलियन रिकॉर्ड के पैमाने पर क्या होता है?

उत्तर

7

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

दूसरी ओर, जब मैं अधिकांश डेटा शून्य करता हूं तो मुझे एक आर्किटेक्चर समस्या दिखाई देती है। सामान्य कारण या तो एक है) एक अनुचित सामान्यीकृत डेटाबेस या बी) डेटाबेस को करने से पहले "बिल्ड" डेटा के लिए अलग-अलग तालिकाओं को बनाने के बजाय उपयोगकर्ताओं को अंत तालिका में डेटा को चरणबद्ध करने की अनुमति देने का प्रयास।

आपके डेटाबेस का सर्वोत्तम आर्किटेक्चर निर्धारित करने के लिए यह आपके ऊपर निर्भर है।

  • आवश्यक डेटा
  • वैकल्पिक डाटा

उदाहरण के लिए, मैं:

+1

+1। सलाह के लिए धन्यवाद। – BuddyJoe

+0

$ ग्रेगरी ए बीमर - क्या होगा यदि सामान्यीकरण का परिणाम एकाधिक लिंक टेबल हैं? मैं निश्चित रूप से 7 लिंक टेबल रखता हूं और मैं इन्हें विलय करने की सोच रहा हूं -> http://stackoverflow.com/questions/5604435/should-i-merge-my-link-tables – Steven

-1

75% अप्रयुक्त कॉलम के साथ तालिका न बनाएं। इसे कॉलम के साथ बनाएं जो आप हर समय उपयोग करने जा रहे हैं और अन्य कॉलम के लिए EAV जैसे कुछ उपयोग करने में देखें, या उन्हें एक अलग तालिका में रखें।

+0

के बारे में सोच संलग्न करने के लिए कर सकते हैं सावधानियों के साथ प्रयोग किया जाना चाहिए के रूप में यह समय और प्रदर्शन के लिए गैर शून्य मान के लिए अंतरिक्ष में भूमि के ऊपर का आह्वान अलग टेबल विचार। ईएवी के खिलाफ झुकाव क्योंकि पिवोटिंग की मात्रा मुझे लगातार करना होगा और क्योंकि 10 फ़ील्ड कभी नहीं बदलेंगे। यह एक कॉच डीबी, सिंपलडीबी, और नोट्स जैसे लचीला स्कीमा नहीं है। – BuddyJoe

+0

यदि 10 फ़ील्ड कभी भी बदलने के लिए नहीं जा रहे हैं/निश्चित रूप से एक अलग तालिका के साथ जाने के लिए जोड़े गए हैं। –

2

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

2

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

जब भी संभव हो, मैं इसके बजाय डिफ़ॉल्ट मान का उपयोग करने का प्रयास करता हूं, इसलिए यदि आपके पास उदा। टाइप INT के कुछ आईडी मान, आप 0 या -1 का उपयोग "नो वैल्यू वर्तमान" सूचक के रूप में कर सकते हैं। इस तरह, आप मूल्य (फ़ील्ड < 0) के लिए चेक करने से बच सकते हैं और NULL अलग से जांच सकते हैं (फ़ील्ड IS NULL है या न्यूल नहीं है)।

मार्क

0

सुनिश्चित करने का केवल एक ही तरीका है। आगे बढ़ें और 100 मिलियन रिकॉर्ड डालें और फिर अंत तक प्रदर्शन को मापें।

+0

जबकि मैं इस विधि के साथ इस बात से सहमत हूं, यह सतह पर, परीक्षण करने के लिए एक अपेक्षाकृत मैला तरीका है, जो खराब वास्तुकला प्रतीत होता है। –

+0

सहमत हुए, और भविष्य में एक और कॉलम जोड़ना असंभव होगा। – GateKiller

6

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

  • UserDetails
  • उपयोगकर्ता तालिका

    • उपयोगकर्ता बुनियादी जानकारी है, जो मैं उपयोगकर्ता नाम, नाम और सत्र जानकारी जैसे हर समय की आवश्यकता होगी।

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

      इसे vertical partitioning के रूप में जाना जाता है।

    +0

    +1 नई शब्दावली के लिए धन्यवाद। मुझे उस पर कुछ पढ़ना होगा और कुछ पढ़ना होगा। मुझे आश्चर्य है कि इस रणनीति के साथ प्रदर्शन कैसा लगता है जब आप लाखों रिकॉर्डों में शामिल होते हैं। मुझे लगता है कि 1-से-1 जॉइन वास्तव में महंगा नहीं है अगर चीजों को अनुक्रमित किया गया हो। – BuddyJoe

    +0

    कोई समस्या नहीं :) आपको केवल संपूर्ण रिकॉर्ड देखने की आवश्यकता होने पर ही जानकारी में शामिल होना चाहिए। आवश्यक डेटा का उपयोग खोज, ब्राउज़िंग, लिस्टिंग आदि के लिए किया जाना चाहिए। यह 1 बड़ी तालिका से थोड़ा धीमा हो सकता है लेकिन यह अधिक स्केलेबल है। – GateKiller

    1

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

    अब, नल मान कॉलम से नहीं पढ़े जाते हैं, उन्हें नल बिटमैप्स से पढ़ा जाता है। जब शून्य का पता चला है वास्तविक मूल्य पढ़ने

    को छोड़ दिया जाता है विरल सुविधा आपको filtered indexing on non-null part of a column

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