लंबे कॉलम प्रभाव और डिस्क उपयोग को कैसे प्रभावित करते हैं?


26

हमारी वर्तमान परियोजना में यह बहुत बार होता है, कि हमें कुछ पात्रों द्वारा स्तंभों का विस्तार करने की आवश्यकता है। से varchar(20)करने के लिए varchar(30)और पर इतना।

वास्तव में, यह वास्तव में कितना मायने रखता है? यह कितना अच्छा है? सामान्य "इनपुट" फ़ील्ड के लिए केवल 100 या 200 या 500 वर्णों की अनुमति देने का क्या प्रभाव है? एक ईमेल में केवल 320 वर्ण हो सकते हैं, इसलिए ठीक है - वहां एक अच्छी सीमा है। लेकिन अगर मैं इसे 200 पर सेट करता हूं तो मुझे क्या हासिल होगा, क्योंकि मुझे इससे ज्यादा ई-मेल पते की उम्मीद नहीं है।

आमतौर पर हमारे टेबल में 100.000 से अधिक पंक्तियाँ नहीं होंगी, और 20 या 30 तक ऐसे कॉलम होंगे।

हम अब SQL Server 2008 का उपयोग करते हैं, लेकिन यह जानना दिलचस्प होगा कि विभिन्न DB इस मुद्दे को कैसे संभालते हैं।

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

मामले में यह है, मैं यहाँ हूँ जानने के लिए :-)

जवाबों:


12

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

प्रारूपित करना किसी भी ग्राहक उपकरण है जो प्रारूपों क्षेत्रों के आकार के आधार पर डेटा विशेष प्रारूपण विचार की आवश्यकता होगी। डिफ़ॉल्ट रूप से उदाहरण के लिए ओरेकल का एसक्यूएल * प्लस, वचर 2 कॉलम के अधिकतम आकार को प्रदर्शित करता है, भले ही डेटा केवल एक वर्ण लंबा हो। की तुलना करें ...

create table f1 (a varchar2(4000), b varchar2(4000));
create table f2 (a varchar2(5), b varchar2(5));
insert into f1 values ('a','b');
insert into f2 values ('a','b');
select * from f1;
select * from f2;

खराब डेटा फ़ील्ड की लंबाई खराब डेटा को पकड़ने / रोकने के लिए एक अतिरिक्त तंत्र प्रदान करती है। एक इंटरफ़ेस को 100 वर्णों के क्षेत्र में 3000 वर्णों को सम्मिलित करने का प्रयास नहीं करना चाहिए, लेकिन यदि उस क्षेत्र को 4000 वर्णों के रूप में परिभाषित किया गया है, तो यह बस हो सकता है। डेटा एंट्री स्टेज पर त्रुटि को पकड़ा नहीं जा सकता है, लेकिन जब कोई अन्य एप्लिकेशन डेटा और चोक को संसाधित करने की कोशिश करता है, तो सिस्टम को और परेशानी हो सकती है। एक उदाहरण के रूप में, यदि आप बाद में ओरेकल में क्षेत्र को अनुक्रमित करने का निर्णय लेते हैं तो आप अधिकतम प्रमुख लंबाई (ब्लॉक आकार और संयोजन के आधार पर) से अधिक हो जाएंगे। देख…

create index i1 on f1(a);

मेमोरी यदि क्लाइंट एप्लिकेशन अधिकतम आकार का उपयोग करके मेमोरी आवंटित करता है, तो एप्लिकेशन आवश्यक से अधिक मेमोरी आवंटित करेगा। इससे बचने के लिए विशेष विचार करना होगा।

दस्तावेज़ीकरण क्षेत्र का आकार डेटा के बारे में प्रलेखन का एक और डेटा बिंदु प्रदान करता है। हम सभी तालिकाओं को t1, t2, t3, आदि और सभी क्षेत्रों को f1, f2, f3, आदि कह सकते हैं, लेकिन सार्थक नामों को निर्दिष्ट करके हम डेटा को बेहतर ढंग से समझते हैं। उदाहरण के लिए, यदि अमेरिका में ग्राहकों के साथ एक कंपनी के लिए एक पता तालिका में राज्य नामक एक क्षेत्र है जो दो वर्ण हैं तो हम उम्मीद करते हैं कि दो वर्ण राज्य संक्षिप्त नाम उसमें जाएंगे। दूसरी ओर यदि क्षेत्र एक सौ वर्णों का है तो हम उम्मीद कर सकते हैं कि पूर्ण राज्य का नाम मैदान में जा सकता है।


यह सब कहा जा रहा है, यह बदलाव के लिए तैयार होने के लिए विवेकपूर्ण लगता है। सिर्फ इसलिए कि आपके सभी उत्पाद नाम आज 20 वर्णों में फिट हैं, इसका मतलब यह नहीं है कि वे हमेशा करेंगे। ओवरबोर्ड मत जाओ और इसे 1000 बनाओ, लेकिन प्रशंसनीय विस्तार के लिए जगह छोड़ दें।



प्रलेखन एक अच्छा है जिसे आपने यहां जोड़ा है जो मैंने कहीं और नहीं देखा है।
जेटी

9

यहां आपके लिए एक अच्छा शुरुआती बिंदु है।

http://www.sqlskills.com/BLOGS/KIMBERLY/post/Disk-space-is-cheap.aspx

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

यहाँ डेटा प्रकार चयन पर अच्छा संदर्भ है: http://sqlfool.com/2009/05/performance-considerations-of-data-types/

Varchar (20) से varchar (30) में बदलना कुछ छोटा सा लग सकता है, लेकिन आपको इस बारे में अधिक समझने की आवश्यकता है कि संभावित मुद्दों के बारे में पता करने के लिए डेटाबेस संरचनाएं कैसे काम करती हैं। उदाहरण के लिए, varchar (30) पर जाने से आप अपने कॉलम के टिपिंग पॉइंट को पीछे धकेल सकते हैं (सभी 30 बाइट्स का उपयोग किया जाना चाहिए) एक पेज (8060 बाइट्स से कम) पर स्टोर किया जा सकता है। यह डिस्क स्थान का उपयोग करने, प्रदर्शन में कमी और यहां तक ​​कि आपके लेन-देन लॉग के साथ कुछ अतिरिक्त ओवरहेड में वृद्धि करेगा।

यहाँ डेटाबेस संरचनाओं के लिए एक लिंक है: http://technet.microsoft.com/en-us/sqlserver/gg313756.aspx

यहाँ पृष्ठ विभाजन और ट्रक्स लॉगिंग के लिए एक है: http://sqlskills.com/BLOGS/PAUL/post/How- सस्ती-are-page-splits-in-terms-of-transaction-log-aspx

HTH


7

मुझे लगा कि मैं एक और दिलचस्प बात साझा करूँगा, जो मुझे निम्नलिखित SO प्रश्न में मिली:

/programming/148398/are-there-any-disadvantages-to-always-using-nvarcharmax

मूल उत्तर इनके द्वारा: निक कावडिया

अधिकतम या पाठ फ़ील्ड का उपयोग नहीं करने का एक कारण यह है कि आप [ऑनलाइन इंडेक्स रियॉड्स] [1] अर्थात ऑनलाइन के साथ REBUILD को SQL सर्वर एंटरप्राइज संस्करण के साथ भी नहीं कर सकते।

[१]: http://msdn.microsoft.com/en-us/library/ms188388%28SQL.90%29.aspx "ऑनलाइन इंडेक्स रीबिल्ड्स"

मैं मनमाने ढंग से n / varchar (अधिकतम) कॉलम जोड़ते समय इसे एक बड़ा नुकसान समझूंगा, और MS साइट के अनुसार ऑनलाइन इंडेक्स रिबर्ड करने के खिलाफ यह प्रतिबंध SQL Server 2008, 2008 R2 और Denali में रहता है; इसलिए यह SQL Server 2005 के लिए विशिष्ट नहीं है।

धन्यवाद, जेफ


6

कुछ मामलों में, आपके द्वारा किसी varchar फ़ील्ड के लिए आवंटित स्थान की मात्रा, इन-मेमोरी सॉर्ट के लिए आवंटित मेमोरी की मात्रा को प्रभावित करेगी।

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

http://webcasts2.sqlworkshops.com/webcasts.asp

इस वेबकास्ट को निम्नलिखित वेबसाइट पर एक लेख के रूप में भी प्रस्तुत किया गया था:

http://www.mssqltips.com/tip.asp?tip=1955

इस प्रस्तुति में ध्यान दें कि जिस कॉलम को छांटा जा रहा है, वह चार्ट / वर्चर कॉलम नहीं है, लेकिन मेमोरी में वर्चर कॉलम के लिए आवंटित स्थान की मात्रा कुछ मामलों में क्वेरी के प्रदर्शन में अंतर लाती है।


4

ANSI_PADDING चालू करें?

आप बहुत पीछे चल रहे व्हाट्सएप के साथ ...


3

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

Varchar data type एक "वैरिएबल" डेटा प्रकार है, इसलिए यदि आप varchar (500) की सीमा निर्धारित करते हैं तो यह उस क्षेत्र के लिए अधिकतम वर्ण लंबाई है। न्यूनतम लंबाई 0 और 500 के बीच हो सकती है। दूसरी तरफ, डिस्क स्पेस का दावा 10, 30 या 500 कैरेक्टर फील्ड के लिए अलग होगा।

मैंने कभी-कभी डेटा प्रकार varchar (800) के लिए एक परीक्षण किया था और अशक्त मूल्यों के लिए मैंने 17 बाइट्स का उपयोग किया था, और प्रत्येक वर्ण के लिए इसे एक और बाइट जोड़ा। उदाहरण के लिए 400 कैरेक्टर स्ट्रिंग में डिस्क पर 417 बाइट्स थे।


3

मुझे नहीं लगता, कि varchar (20) या varchar ((8000) के कॉलम के साथ बनाई गई तालिकाओं में कोई अंतर है, जब तक कि वास्तविक अधिकतम लंबाई <= 20 है।

दूसरी तरफ, कुछ मामलों में उपयोगकर्ताओं को लंबे समय तक तार को स्टोर करने की संभावना देने से उन्हें ऐसा करने के लिए प्रोत्साहित किया जा सकता है।

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