2010-04-03 5 views
27

यहां मेरी स्थिति है।क्या तालिका में VARCHAR (MAX) का उपयोग करने के नुकसान हैं?

असल में, मुझे अक्षरों की अज्ञात लंबाई को पकड़ने के लिए तालिका में एक स्तंभ की आवश्यकता है। लेकिन मैं उत्सुक था कि एसक्यूएल सर्वर प्रदर्शन समस्याओं में कॉलम में एक VARCHAR (MAX) या NVARCHAR (MAX) का उपयोग करके उत्पन्न हो सकता है, जैसे: 'इस बार' मुझे केवल 3 वर्णों को स्टोर करने की आवश्यकता है और अधिकांश समय मुझे केवल आवश्यकता है 10 अक्षर स्टोर करें। लेकिन एक छोटी संभावना है कि यह उस कॉलम में दो हजार वर्णों तक हो सकता है, या यहां तक ​​कि संभवतः एक मिलियन, यह अप्रत्याशित है। लेकिन, मैं गारंटी दे सकता हूं कि यह 2 जीबी सीमा से अधिक नहीं होगा।

यदि कोई प्रदर्शन समस्या है, या संभवतः इस समस्या को हल करने के बेहतर तरीके हैं तो मैं उत्सुक था।

उत्तर

14

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

जब MAX डेटा प्रकार में डेटा 8 KB से अधिक हो जाता है, तो एक ओवर-फ्लो पृष्ठ का उपयोग किया जाता है। SQL सर्वर 2005 स्वचालित रूप से पृष्ठ पर एक ओवर-फ्लो संकेतक असाइन करता है और जानता है कि डेटा पंक्तियों को उसी तरीके से कैसे उपयोग किया जाए, वैसे ही यह अन्य डेटा प्रकारों में हेरफेर करता है।

आगे पढ़ने के लिए, बाहर की जाँच पुस्तकें ऑनलाइन: char and varchar

+1

जबकि पूरी तरह से ठीक है, मैं, के बाद से पंक्ति-ओवरफ्लो, varchar (एन) के लिए पेज प्रकार का नाम है, जबकि varchar (max) अवधि अतिप्रवाह का उपयोग कर से बचने के हैं चला जाता है डीबीसीसी इंडेक्स – Andrew

-2

नहीं है, varchar (max) ही प्रविष्टि के आकार पर आधारित समायोजित कर देता है, तो यह सबसे कारगर है अगर आप व्यापक रूप से विभिन्न आकार आदानों का उपयोग किया जाएगा।

3

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

6

आप अनुक्रमित varchar(max) (और nvarchar(max)) स्तंभों पर नहीं बना सकते हैं (हालांकि वे उन्हें में शामिल किया जा सकता है। लेकिन जो एक सूचकांक में एक स्तंभ है कि 2GB ?! को मिल सकता है शामिल होंगे) इसलिए यदि आप यह मान पर खोज करना चाहते हैं , जब तक आप पूर्ण-पाठ अनुक्रमणिका का उपयोग नहीं करते हैं, तब तक आप एक स्कैन करेंगे। साथ ही, याद रखें कि किसी भी रिपोर्ट डिजाइनर या प्रस्तुति डिजाइनर (वेब ​​या अन्यथा) को यह मानना ​​चाहिए कि कोई उस विश्वकोश को उस कॉलम में रख सकता है और इसके चारों ओर डिज़ाइन कर सकता है। "उपयोगकर्ता शायद एक्स नहीं करेंगे" सुनने से कुछ भी बुरा नहीं है। यदि कोई उपयोगकर्ता ऐसा कर सकता है, तो वे इसे करेंगे। यदि कोई उपयोगकर्ता एक कॉलम में एक टोम में डाल सकता है, तो कुछ बिंदु पर वे करेंगे। यदि उन्हें कभी नहीं करना चाहिए, तो आईएमओ, कॉलम आकार को कुछ उचित स्तर पर कैप करने के लिए और अधिक समझदारी होती है और यदि कोई उपयोगकर्ता उस कॉलम में अधिक सामान लगाने की कोशिश करता है, तो यह इस बात पर चर्चा करेगा कि उन्हें उस मूल्य में प्रवेश करना चाहिए या नहीं उस कॉलम को पहले स्थान पर।

+0

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

+0

@ dan04 - IME, डेवलपर अक्सर कॉलम के वास्तविक इरादे पर एक spec प्राप्त करने के लिए समय नहीं व्यतीत करते हैं। कोई सीमा निर्धारित करने में समस्या यह है कि उपयोगकर्ता कॉलम में बकवास डालते हैं क्योंकि वे तब रिपोर्ट कर सकते हैं जब उनकी रिपोर्ट फ्यूबर हो या स्क्रीन लोड हो जाए या वे फर्स्टनाम अंतिम नाम को एक ही फ़ील्ड में डाल दें और अब वे आखिरी बार सॉर्ट नहीं कर सकते नाम इत्यादि ताकि आपको जो भी हो रहा है उसे रोकने और अपने डेटा को ठीक करने की आवश्यकता है। कुछ सीमा के बिना, ऐसा कुछ भी नहीं है जो इंगित करेगा, जब तक कि बहुत देर हो जाए, कि कोई ऐसा कॉलम में कुछ सामान लगाने की कोशिश कर रहा है जो वहां नहीं होना चाहिए। – Thomas

+0

समस्या यह है कि ऐसे लोग हैं जो वास्तव में * 40-अक्षर एकाधिक-हाइफेनेटेड अंतिम नाम रखते हैं, और जब आप इसे VARCHAR (16) में मजबूर करने का प्रयास करते हैं तो शिकायत करते हैं। – dan04

2

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

लेकिन आम तौर पर, जब आपके पास तालिका में वर्चर (अधिकतम) कॉलम होते हैं, तो आपको उन प्रकार के परिचालनों को बड़े पैमाने पर नहीं करना चाहिए, इसलिए मैं कहूंगा कि यदि आप तालिका में अपनी डेटा आवश्यकताओं के लिए इसे सही तरीके से उपयोग कर रहे हैं , तो यह ठीक है।

0

क्रिस्टल रिपोर्ट 12 (और जहां तक ​​मुझे पता है) अन्य संस्करण ठीक से वर्चर (अधिकतम) को संभाल नहीं पाते हैं और इसे वर्चर (255) के रूप में व्याख्या करते हैं जो रिपोर्ट में डेटा को छोटा कर देता है।

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

देखें:
http://www.crystalreportsbook.com/Forum/forum_posts.asp?TID=5843&PID=17503
http://michaeltbeeitprof.blogspot.com/2010/05/crystal-xi-and-varcharmax-aka-memo.html

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