2008-11-13 9 views
11

मेरी वर्तमान परियोजना पर, मैं अपने मास्टर डीबी लिपि में आया था। इस पर एक नज़र डालने पर, मैंने देखा कि हमारी सभी मूल प्राथमिक कुंजीों में डेटा प्रकार संख्यात्मक (38,0) हम वर्तमान में SQL Server 2005 को हमारे प्राथमिक डीबी प्लेटफ़ॉर्म के रूप में चला रहे हैं।संख्यात्मक (38,0); अच्छा, बुरा, कौन परवाह करता है?

थोड़ा संदर्भ के लिए, हम ओरेकल और एसक्यूएल सर्वर दोनों को हमारे बैक-एंड के रूप में समर्थन करते हैं। ओरेकल में, हमारी प्राथमिक कुंजी में डेटा प्रकार संख्या (38,0) होता है।

क्या कोई इस तरह के कार्यान्वयन के संभावित साइड इफेक्ट्स और प्रदर्शन प्रभाव के बारे में जानता है? मैंने हमेशा प्राथमिक कुंजी के रूप में int या बिगिन को प्राथमिक कुंजी के रूप में वकालत और कार्यान्वित किया है और यह जानना अच्छा होगा कि संख्यात्मक (38,0) एक बेहतर विकल्प है या नहीं।

उत्तर

12

ठीक है, आप संख्याओं को संग्रहीत करने के लिए अधिक डेटा खर्च कर रहे हैं जिन्हें आप वास्तव में कभी नहीं पहुंच पाएंगे।

bigint चला जाता है अप करने के लिए 9,223,372,036,854,775,807 8 में बाइट्स

पूर्णांक 4 बाइट में 2,147,483,647 अप करने के लिए चला जाता है

एक अंकीय (38,0), ले अगर मैं गणित सही कर रहा हूँ, 17 बाइट्स जा रहा है ।

कोई बड़ा अंतर नहीं है, लेकिन: छोटी डेटाटाइप = स्मृति में अधिक पंक्तियां (या पंक्तियों के समान # के लिए कम पृष्ठ) = लुकअप करने के लिए कम डिस्क I/O (या तो अनुक्रमित या डेटा पृष्ठ चाहता है)। प्रतिकृति, लॉग पेज इत्यादि के लिए यह जाता है

SQL सर्वर के लिए: आईएनटी एक आईईईई मानक है और सीपीयू की तुलना करने के लिए इतना आसान है, इसलिए आपको आईएनटी बनाम NUMERIC (जो कि है) का उपयोग करके थोड़ा प्रदर्शन बढ़ाता है एक पैक दशमलव प्रारूप)। (ओरेकल में नोट, यदि वर्तमान संस्करण पुराने संस्करणों से मेल खाता है, तो सभी डेटाटाइप पैक किए गए हैं, इसलिए एक आईएनटी अंदर एक NUMERIC (x, 0) जैसा ही है, इसलिए कोई प्रदर्शन अंतर नहीं है)

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

अन्यथा इस बिंदु पर, मैं इसे छोड़ दूंगा। चीजों को बदलने की जरूरत नहीं है।

+0

एक छोटी टिप्पणी: "छोटी डेटाटाइप = स्मृति में अधिक पेज" को "छोटी डेटाटाइप = अधिक पंक्तियां या स्मृति में रिकॉर्ड" पढ़ना चाहिए। पेज हमेशा 8K होते हैं, चाहे वे कॉलम या इंडेक्स के आकार के आकार के बावजूद हों। – Rick

+0

रिक: हाँ मेरे बुरे। होना चाहिए: पंक्तियों की एक ही संख्या के लिए स्मृति में कुछ पेज, या जैसा आपने कहा - अधिक पंक्तियां। अच्छी पकड़। मुझे लगता है कि मैं विकी बनने के बिना इसे संपादित कर सकता हूं, मैं –

+0

जिज्ञासा से बाहर हूं, यह तथ्य क्यों है कि आईएनईई मानक आईएनई मानक है, सीपीयू की तुलना करना आसान बनाता है? –

3

स्टोरेज विचारों और भविष्य के डीबीए से शुरुआती भ्रम को छोड़कर, मुझे कोई कारण नहीं दिख रहा है कि NUMERIC (38,0) एक बुरा विचार क्यों होगा। आप अपनी मेज में 9.9 9 x 10^38 रिकॉर्ड तक की अनुमति दे रहे हैं, जो आप निश्चित रूप से कभी नहीं पहुंचेंगे। इस में मेरी त्वरित खुदाई ने इसका उपयोग न करने के किसी भी चमकदार कारण को नहीं बदला। मुझे संदेह है कि आपका एकमात्र संभावित मुद्दा उस उपभोग की भंडारण की जगह होगी, लेकिन यह देखकर कि भंडारण स्थान कितना सस्ता है, यह कोई मुद्दा नहीं होना चाहिए।

मैंने ओरेकल डेटाबेस में यह उचित संख्या देखी है क्योंकि यह एक बहुत बड़ा डिफ़ॉल्ट मान है जिसे आपको टेबल बनाने के बारे में सोचने की आवश्यकता नहीं है, डिफ़ॉल्ट रूप से INT या BIGINT का उपयोग करने के समान एस क्यू एल सर्वर।

2

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

मुझे नहीं लगता कि यह फिक्सिंग को परेशान करने के लिए पर्याप्त टूटा हुआ है।

+0

"कभी नहीं" एक खतरनाक शब्द है। यदि मैंने स्टैक ओवरफ्लो के वेबसर्वर से सभी ट्रैफ़िक को स्टोर करने के लिए लॉगिंग टेबल बनाया है, तो मुझे लगता है कि मैं बिना किसी परेशानी के BigInt ओवरफ़्लो कर सकता हूं। – Rick

+0

वह सबसे महत्वपूर्ण समस्या भूल गया: जुड़ने के लिए तुलना समय। एक int की तुलना में एक संख्यात्मक (38) से मेल खाने में अधिक समय लगता है। यदि आप एक साथ दो बड़ी तालिकाओं में शामिल हो रहे हैं जो जोड़ सकते हैं। –

+2

@ रिक - यहां तक ​​कि यदि एसओ को दिन में 10 मिलियन हिट मिल रही हैं, तो बिगिनट बहने से 2.5 अरब साल लगेंगे। –

3

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

+0

जोएल, आपके उत्तर के लिए धन्यवाद, लेकिन चूंकि हमें उन पीके को एफके में उपयोग करने की आवश्यकता है, इसलिए हमारे उद्देश्यों के लिए काम करने के लिए GUID कुछ और बोझिल हैं। अब, मैं पूरी तरह से सहमत हूं कि हमारे पास 3 कुंजी होनी चाहिए: आंतरिक (int), व्यवसाय, और निश्चित रूप से, डिस्कनेक्ट की जरूरतों के लिए GUID। – user37179

+1

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

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