INT पर TINYINT का उपयोग कब करें?


91

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

उदाहरण के लिए, यह उपयोग करने के लिए बेहतर है tinyintजब आप जानते हैं कि आपके द्वारा संग्रहीत एकमात्र डेटा 1, 0 या शून्य है (जो कि 2 या 3 बाद में विस्तार करने की बहुत कम संभावना है)।

हालांकि, मुझे ऐसा करने का एकमात्र कारण भंडारण उद्देश्यों के लिए है - 4 बाइट्स के बजाय एक पंक्ति पर 1 बाइट का उपयोग करना।

आपकी हार्ड ड्राइव पर स्थान बचाने के अलावा, बस tinyint(या smallintया bigintअधिक) का उपयोग करने के क्या प्रभाव हैं int?


2
यह एक बहुत अच्छा quesiton (+1) है। MySQL में SELECT है ... PROCEDURE ANALYZE () जो वास्तव में दिए गए SELECT के लिए टेबल के सबसे छोटे डेटा प्रकारों की सिफारिश करता है। वह आंशिक रूप से मेरे उत्तर के पीछे की प्रेरणा थी।
RolandoMySQLDBA

3
ठीक सवाल है, लेकिन सटीक करने के लिए छोटे रेंज 0-255 है। बिट फ़ील्ड 0 या 1 (या NULL) है। एक टिंट के लिए भंडारण लागत 1 बाइट है। तालिका में प्रत्येक 8 बिट फ़ील्ड में भंडारण के 1 बाइट का खर्च आएगा। msdn.microsoft.com/en-us/library/ms187745.aspx और msdn.microsoft.com/en-us/library/ms177603.aspx
billinkc

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

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

2
@ user6665 I'd use an ENUM for such a thing.SQL सर्वर में नहीं, आप नहीं करेंगे, क्योंकि इसमें किसी भी प्रकार की गणना नहीं है।
अंडरस्कोर_ड

जवाबों:


92

डिस्क स्थान सस्ता है ... यह बात नहीं है!

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

ओवरराइडिंग संदेश डिजाइन के मामले हैं। अंतर तब तक अलग-अलग डेटाबेस में उचित रूप से निर्दिष्ट सर्वर पर दिखाई नहीं देगा जब तक आप VLDB क्षेत्र से नहीं टकराते, लेकिन यदि आप कुछ बाइट्स बचा सकते हैं, तो ऐसा क्यों नहीं करें।

मुझे पहले के प्रश्न में वर्णित पर्यावरण की याद आ रही है । 400+ डेटाबेस, आकार में 50mb-50GB, प्रति SQL उदाहरण से लेकर। उस वातावरण में प्रति डेटाबेस प्रति रिकॉर्ड, प्रति तालिका कुछ बाइट्स स्क्रब करना, एक महत्वपूर्ण अंतर बना सकता है।


29

अन्य उत्तरों के अलावा ...

पंक्तियों और सूचकांक प्रविष्टियों को 8k पृष्ठों में संग्रहीत किया जाता है। इसलिए प्रति पंक्ति 3 बाइट्स पर एक लाख पंक्तियाँ डिस्क पर 3 एमबी नहीं है: यह प्रति पृष्ठ पंक्तियों की संख्या ("पृष्ठ घनत्व") को प्रभावित करती है।

यही बात नर्वरा पर भी लागू होती है, स्मार्ल्डटाइमटाइम टू डेटटाइम, इंट टू स्मालिंट आदि

संपादित करें, जून 2013

http://sqlblog.com/blogs/joe_chang/archive/2013/06/16/load-test-manifesto.aspx

यह लेख बताता है

महत्वपूर्ण मानदंड कार्डिनलिटी और पेज टू रो अनुपात हैं।

तो, डेटा प्रकार का चुनाव मायने रखता है


5
अच्छी बात। एक पूरी तरह से सबसे खराब स्थिति उदाहरण 4028 बाइट पंक्ति है जिसमें पूरी तरह से तय लंबाई वाले कॉलम हैं जिनसे आप एक कॉलम जोड़ना चाहते हैं। एक छोटा-सा जोड़ना आपको 4030 (प्रति पृष्ठ 2 पंक्तियों) पर ले जाएगा, लेकिन एक int आपको सीमा से अधिक धक्का देता है (प्रति पृष्ठ 1 पंक्ति, 4028 बाइट्स प्रति पृष्ठ बर्बाद)।
मार्क स्टोरी-स्मिथ

मैंने एक बार int बनाम bigint पर एक प्रदर्शन परीक्षण किया था। 1 मिलियन रिकॉर्ड्स की बचत, समय और भंडारण की तुलना करना और उन्हें एक-एक करके पुनः प्राप्त करना, फिर से प्रदर्शन को मापना। मैंने बड़े अंतर नहीं देखे। मैं int बनाम smallint के लिए एक ही प्रदर्शन परीक्षण करने जा रहा हूं। मुझे वास्तव में लगता है कि 80% अनुप्रयोगों के लिए इसे उपेक्षित किया जा सकता है, जिसके परिणामस्वरूप अधिक सुसंगत डेटा प्रकार और कम रखरखाव लागत होती है।
सईद नेमाती

1
@SaeedNeamati आप मार्क के उत्तर (" क्या आपने कभी सुना है ... चलो यह पूरा हो गया है - हम बाद में प्रदर्शन के बारे में चिंता करेंगे ... ) और मैं यहाँ है gbn के जवाब से लेख को फिर से पढ़ना चाहते हो सकता है ? । मुझे लगता है कि घर ले जाना यह है कि कोई भी अयोग्य विकल्प अपनी धारियों को सही पैमाने पर दिखाने वाला है, और ओपी का पेट गलत नहीं है।
रफिन

14

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

मैं निश्चित रूप से यह खोजने की उम्मीद करूंगा कि BTREE पृष्ठों में सूचकांक प्रविष्टियों की जांच छोटे डेटा प्रकारों के साथ थोड़ी तेज होगी। हालाँकि, अनुक्रमणिका प्रविष्टियों में शामिल कोई VARCHARs INT पर TINYINT का उपयोग करने से प्रदर्शन लाभ (अशक्त) करेगा।

इसके बावजूद, यदि अनुक्रमणिका प्रविष्टियों में यौगिक प्रविष्टियाँ हैं और सभी पूर्णांक हैं, तो पूर्णांक छोटे होते हैं, बेहतर और तेज़।


13

जब डेटाबेस बड़ा हो जाता है तो सभी चीजें जटिल हो जाती हैं:

  • रखरखाव खिड़कियों को बढ़ाना या पुनर्निर्धारित करने की आवश्यकता है
  • बैकअप (दिन-ब-दिन पूर्ण बैकअप एक बेतुका समय-भक्षक बन जाता है, इसलिए आपको एक अंतर की आवश्यकता होती है या यहां तक ​​कि बैकअप भी लॉग इन करना पड़ता है और सप्ताह में एक बार पूरा करना होता है, शायद महीने में एक बार)
  • प्रदर्शन maintanances एक समय-भक्षक बन जाता है (एक बहु-मिलियन-पंक्ति तालिका पर एक इंडेक्स बनाने में निष्पादन के लिए तुच्छ समय नहीं लगता है) और इसे पुनर्निर्धारित करने की आवश्यकता होती है और यदि तालिका व्यापक है तो खराब हो जाती है ...
  • और उस 100Gb बैकअप को नेटवर्क के माध्यम से प्रेषित करना वह नहीं है जिसे मैं केक का एक टुकड़ा कहता हूं - विशेष रूप से अगर नेटवर्क (किसी अज्ञात कारण के लिए) 75Gb निशान पर कनेक्शन को छोड़ने पर जिद्दी हो ... (एक स्थापना के साथ मैं काम कर रहा था जो कि काम कर रहा था) नेटवर्क पर मैप की गई ड्राइव का बैकअप ले रहा था - नेटवर्क) ...

और क्या datatypes के साथ क्या करना है? सब कुछ। पंक्ति के आकारों को आवश्यकता से अधिक उपयोग करने से डेटाबेस पृष्ठ आवश्यकता से पहले भर जाता है या यहां तक ​​कि अंतरिक्ष को बर्बाद कर देता है यदि पंक्ति का आकार ऐसा है कि पृष्ठ पर एक से अधिक रिकॉर्ड दर्ज करने में सक्षम नहीं है। परिणाम लिखने और पढ़ने के लिए अधिक पृष्ठों की आवश्यकता होती है, अधिक रैम मेमोरी का उपयोग कैश करने के लिए किया जाता है (बड़े रिकॉर्ड को बड़ी मेमोरी की आवश्यकता होती है)। और जब से आपके डेटाटिप्स को डिस्क से आवश्यकता से अधिक निर्दिष्ट किया जाता है, तो आपकी अनुक्रमणिका को एक ही समस्या का सामना करना पड़ेगा - विशेष रूप से यदि आप उस समग्र 2 बड़े कॉलम को प्राथमिक कुंजी देते हैं, क्योंकि किसी भी अन्य अनुक्रमित द्वारा बनाई गई उस प्राथमिक कुंजी को उनके परिभाषा पर निहित होगा।

यदि आप जानते हैं कि एक तालिका में कुछ कॉलम जिसमें लाखों पंक्ति या थोड़ी सी भी तालिका होगी, जो बहु-मिलियन-पंक्ति में FK'ed होगी जिन्हें अपने डेटा को संग्रहीत करने के लिए 4 बाइट्स पूर्णांक की आवश्यकता नहीं है, लेकिन एक 2 बाइट होगा प्रत्यय - SMALLINT का उपयोग करें । यदि मान 0-255 की सीमा में पर्याप्त है, तो TINYINT । हां / नहीं झंडा? नहीं है बीआईटी


9

जबकि tinyintबनाम के लिए intडिस्क स्पेस, पेज स्प्लिट और रखरखाव समय जैसे स्पष्ट अंतर हैं, इनमें से कोई भी नहीं होगा varchar

तो क्यों नहीं सभी पाठ क्षेत्रों की घोषणा करें varchar(4000), क्योंकि यह वैसे भी केवल आवश्यक स्थान का उपयोग करेगा? इससे भी अधिक आपको इस बात की गारंटी दी जाएगी कि आपका डेटा कभी भी समाप्त नहीं होगा।

जवाब है:

  1. आपके इरादों का स्पष्टीकरण (जैसा कि किसी को भी नहीं पता होगा कि एक नाम क्षेत्र 4000 वर्णों का क्यों होना चाहिए)
  2. सत्यापन के रूप में आप यह सुनिश्चित करना चाहते हैं कि कोई भी नाम के रूप में पूरी जीवनी में प्रवेश न करे।

ये बहुत ही कारण उन पर भी लागू होते हैं tinyint


3
यह एक पुराना धागा है, लेकिन स्पष्टीकरण और सत्यापन ही एकमात्र कारण नहीं है। यदि आपके पास VARCHAR (4000) कुछ है जो VARCHAR (20) होना चाहिए, तो क्वेरी योजना यह सोचेगी कि आपकी मेमोरी और CPU आवश्यकताएं कई गुना हैं, जो उस कॉलम के संबंध में होनी चाहिए। मैंने ऐसा करने के लिए समय नहीं लिया है, लेकिन मैं अनुमान लगा रहा हूं कि आप शायद इसे VARCHAR (20) के लिए एक क्वेरी योजना को देखकर और फिर VARCHAR (4000) में बदलकर और अनुमानित लागतों की जांच कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.