मैक्स पाठ या अधिक विशिष्ट, छोटे प्रकार का उपयोग करना


22

कोई व्यक्ति टेबल बनाने के लिए मेरे DDL कोड की समीक्षा कर रहा था और उसने सुझाव दिया, जब मैंने देखा कि मैंने VARCHAR(256)पाठ के लिए खेतों का उपयोग करते हुए देखा है तो मैं बहुत छोटा होने की उम्मीद करता हूं, जैसे कि पहले नाम या जो भी हो, कि मुझे हमेशा उपयोग करना चाहिए VARCHAR(MAX)और जुड़ा हुआ होना चाहिए, लेकिन varchar (max) का उपयोग क्यों करें ) का है । मैंने इसे पढ़ा लेकिन यह दिनांकित लग रहा था, क्योंकि यह 2005 पर ध्यान केंद्रित कर रहा था, और सभी पाठ क्षेत्रों पर संभावित रूप से 2 जीबी प्रति पंक्ति तक आवंटित करने के लिए किसी भी वास्तविक औचित्य की पेशकश नहीं करता था।

एक प्रदर्शन, भंडारण, आदि के दृष्टिकोण से, किसी को यह निर्णय लेने के बारे में जाना चाहिए कि VARCHAR(MAX)SQL सर्वर के आधुनिक संस्करणों के लिए उपयोग करना या छोटा अधिक विशिष्ट प्रकार है? (उदाहरण, 2008, 2012, 2014)

जवाबों:


31

क्या मुझे हमेशा (n)varchar(max)टेक्स्ट कॉलम के लिए उपयोग करना चाहिए ?

नहीं।

SQL सर्वर के लिए, maxडेटा प्रकार केवल तब निर्दिष्ट किया जाना चाहिए जब कोई विकल्प न हो। इसके बजाय सही आधार प्रकार ( varcharया nvarchar) चुनना चाहिए और एक स्पष्ट अधिकतम लंबाई निर्दिष्ट करनी चाहिए जो संग्रहीत किए जाने वाले डेटा के लिए उपयुक्त है।

भौतिक संग्रहण समान है कि क्या कॉलम टाइप किया गया है varchar(n)या नहीं varchar(max), इसलिए यह चिंता का विषय नहीं है।

हर जगह नहीं चुनने के कारण (n)varchar(max)सुविधाओं, योजना की गुणवत्ता और प्रदर्शन के आसपास घूमते हैं।

एक विस्तृत सूची शायद व्यावहारिक नहीं है, लेकिन अन्य बातों के अलावा, maxकॉलम:

विशेषताएं

  • एक अधिकतम लंबाई लागू करने के लिए एक अलग बाधा की आवश्यकता होती है
  • सूचकांक में एक कुंजी नहीं हो सकती है (इसलिए कोई अनोखी बाधा नहीं है)
  • ऑनलाइन डीडीएल को रोकें (इंडेक्स रीबर्ड्स और एक नया नॉन-नल कॉलम जोड़कर)
  • आमतौर पर 'नए' फीचर्स के लिए समर्थित नहीं होते हैं जैसे कॉलमस्टोर
  • अधिक विशिष्ट सुविधाओं और सीमाओं के लिए उत्पाद प्रलेखन देखें। सामान्य पैटर्न यह है कि maxडेटा प्रकारों के आसपास अजीब सीमाएं और प्रतिबंध हैं। सभी सीमाओं और दुष्प्रभावों का दस्तावेजीकरण नहीं किया गया है।

प्रदर्शन

  • निष्पादन इंजन में विशेष हैंडलिंग की आवश्यकता होती है, संभावित रूप से बहुत बड़े आकार के लिए। आमतौर पर, इसमें स्ट्रीमिंग इंटरफ़ेस के साथ कम कुशल कोड पथ का उपयोग करना शामिल है
  • बाहरी कोड (और SSIS जैसे अन्य SQL सर्वर घटक) के समान अप्रत्याशित परिणाम हो सकते हैं, जो आकार में 2GB तक डेटा को संभालने के लिए भी तैयार होना चाहिए
  • स्मृति अनुदान गणना में 4000 बाइट्स चौड़ी मानी जाती हैं। यह अत्यधिक मेमोरी आरक्षण की ओर ले जाने की संभावना है, जो संगामिति को सीमित करता है, और मूल्यवान इंडेक्स और डेटा पृष्ठों को कैश मेमोरी से बाहर धकेलता है
  • कई महत्वपूर्ण प्रदर्शन अनुकूलन को अक्षम करें
  • लॉक अवधि बढ़ा सकते हैं
  • एक (गैर-गतिशील) चाहने वाली योजना को चुनने वाले ऑप्टिमाइज़र को रोक सकते हैं
  • फ़िल्टर को स्कैन में धकेले जाने से रोकें और एक अवशिष्ट के रूप में देखें
  • टेम्पर्ड प्रेशर और कंसंट्रेशन (संस्करण पर निर्भर) में वृद्धि हो सकती है, क्योंकि maxकॉलम और पैरामीटर को कॉलम के मिलानों के समान टाइप किया जा सकता है।

संक्षेप में, maxविनिर्देशक के उपयोग से अनावश्यक रूप से कई सूक्ष्म (और अवांछनीय) दुष्प्रभाव हैं कि ऐसा करने का कोई मतलब नहीं है। एकल घोषणा का उपयोग करने की मामूली 'सुविधा' किसी प्रकार का मुआवजा नहीं है।

संदर्भ में प्रत्येक प्रकार का मूल्यांकन करें, सही आधार प्रकार ( varcharया nvarchar), और एक समझदार स्पष्ट लंबाई का उपयोग करें।

आगे की पढाई:


8

यह एक विरोधाभास के जवाब की तरह पढ़ने जा रहा है, लेकिन केवल भंडारण और प्रदर्शन के विचार नहीं हैं।

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

मुझे नहीं पता कि यह कैसे करना है, लेकिन सभी पाठ फ़ील्ड बनाकर varchar(max), यदि किसी ग्राहक के पास बॉबी टेबल्स के मुद्दे हैं और / या आपके संग्रहीत कार्यविधियाँ पैरामीटर भी हैं varchar(max), तो आप एक हमलावर के साथ आना आसान बना रहे हैं एक वैध लेकिन चतुराई से खराब पैरामीटर मान जो उन चीजों को कर सकता है जो ग्राहकों को करने वाले नहीं हैं - जो भी है।

वास्तव में आपको जो आवश्यकता है उसकी लंबाई को सीमित करके , आप इन चतुर हमलों से खुद को बचा नहीं रहे हैं (मुझे यकीन भी नहीं है कि वास्तव में इसे क्या कहा जाता है, मुझे बस थोड़ी देर पहले इसके बारे में पढ़ना याद है), लेकिन आप यह नहीं कह रहे हैं " आगे बढ़ो, मुझे चलाने के लिए एक 2GB स्क्रिप्ट देने की कोशिश करो "या तो।


जिसे यह कहा जाता है वह शायद "इंजेक्शन" ("एसक्यूएल इंजेक्शन" है, विशेष रूप से)।
एंड्री एम

@AndriyM हाँ, किसी कारण से मैं एसक्यूएल ट्रंकेशन हमलों के बारे में सोच रहा था (एमएस ने मेरे द्वारा बुकमार्क किए गए लिंक को नीचे ले लिया है) लगता है, लेकिन यह मूल रूप से varchar(not-max)मापदंडों का शोषण कर रहा है, इसलिए मैंने थोड़े से मेरे मुंह में एक पैर अटका दिया। लेकिन हाँ SQL इंजेक्शन यहाँ लागू होगा। शायद मुझे इस जवाब को थोड़ा समझना चाहिए।
मैथ्यू गुइंडन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.