वहाँ varchar (8000) से अधिक varchar (500) के लिए एक फायदा है?


90

मैं इस पर MSDN मंचों और यहाँ पढ़ा है और मैं अभी भी स्पष्ट नहीं हूँ। मुझे लगता है कि यह सही है: वरचर (अधिकतम) को पाठ डेटाटाइप के रूप में संग्रहीत किया जाएगा, ताकि कमियां हों। तो मान लें कि आपका क्षेत्र मज़बूती से 8000 वर्णों के अंतर्गत होगा। मेरे डेटाबेस तालिका में BusinessName फ़ील्ड की तरह। वास्तव में, एक व्यावसायिक नाम संभवतः हमेशा रहेगा (एक संख्या को मेरी टोपी से बाहर निकालना) 500 वर्ण। ऐसा लगता है कि मैं 8k चरित्र की गिनती के तहत अच्छी तरह से भर में चलने वाले चर क्षेत्रों के बहुत सारे लगता है।

तो क्या मुझे उस क्षेत्र को varchar (8000) के बजाय varchar (500) बनाना चाहिए? एसक्यूएल के बारे में मेरी समझ से उन दोनों में कोई अंतर नहीं है। इसलिए, जीवन को आसान बनाने के लिए, मैं अपने सभी varchar क्षेत्रों को varchar (8000) के रूप में परिभाषित करना चाहता हूं। क्या इसमें कोई कमियां हैं?

संबंधित: varchar कॉलम का आकार (मुझे ऐसा नहीं लगा कि किसी ने मेरे सवाल का जवाब दिया है)।


6
एक व्यवसाय कार्ड पर 500 वर्णों के लंबे व्यवसाय के नाम को फिट करने की कोशिश कर रहा है ... :)
OMG Ponies

2
@OMG पॉनीज़: हर बार जब मैं आपका उपयोगकर्ता नाम देखता हूं तो मैं चकरा जाता हूं। अब, आप क्या कह रहे थे? (सिर्फ मजाक करते हुए)
जेकोलम

4
@jcollum: SpaceMan Spiff को हमेशा मेरा वोट मिलेगा। यह सच नहीं है - कोई भी केल्विन और होब्स करेंगे, लेकिन विशेष रूप से बर्फ की मूर्तियां। या एफ -14 उड़ान भरने वाले टायरानोसोरस। लेकिन मैं पचाता हूं ...
ओएमजी पॉनीज

जवाबों:


20

एक प्रोसेसिंग दृष्टिकोण से, यह varchar (8000) बनाम varchar (500) का उपयोग करने के लिए कोई फर्क नहीं पड़ेगा। एक अधिकतम लंबाई को परिभाषित करने के लिए यह एक "अच्छा अभ्यास" प्रकार का अधिक है जो कि एक क्षेत्र को पकड़ना चाहिए और उस लंबाई को आपका चरचर बनाना चाहिए। यह कुछ ऐसा है जो डेटा सत्यापन के साथ सहायता के लिए इस्तेमाल किया जा सकता है। उदाहरण के लिए, राज्य का संक्षिप्त नाम 2 वर्ण या पोस्टल / ज़िप कोड 5 या 9 वर्ण का होना चाहिए। जब आपका डेटा अन्य प्रणालियों या उपयोगकर्ता इंटरफ़ेसों के साथ बातचीत करता था, जहां फ़ील्ड की लंबाई महत्वपूर्ण थी (जैसे कि मेनफ़्रेम फ्लैट फ़ाइल डेटासेट), तो इसके लिए एक अधिक महत्वपूर्ण अंतर हुआ करता था, लेकिन आजकल मुझे लगता है कि यह कुछ और की तुलना में अधिक आदत है।


3
समझ में आता है ... उन चीजों के लिए जो स्वाभाविक रूप से अधिकतम लंबाई होती है। लेकिन अधिकतम लंबाई स्पष्ट नहीं होने पर आप क्या करते हैं? जैसे कोई व्यावसायिक नाम।
jcollum

2
इस तरह के कुछ के लिए, यदि मैं किसी भी तरह का पूर्वानुमान लगाने का अनुमान नहीं लगाता कि आकार संभावित रूप से क्या हो सकता है, तो मैं आमतौर पर डेटा के प्रकार के आधार पर एक varchar (8000) या varchar (अधिकतम) के साथ
जाऊंगा

4
ऐसा लगता है कि इससे 2017 में भी प्रदर्शन पर फर्क पड़ता है: dba.stackexchange.com/a/162117/1822
a_horse_with_no_name

1
अभी हाल ही के जवाब दिखाने वहाँ कि कर रहे हैं लागत: यह अनुकूलन तर्क को प्रभावित करता है मार्टिन स्मिथ के जवाब और भी 8K कुल पंक्ति आकार मुद्दों ने उल्लेख पर विचार GBN और ओलिवर
टूलमेकरसैट

124

एक उदाहरण जहां यह एक अंतर बना सकता है कि यह प्रदर्शन अनुकूलन को रोक सकता है जो ट्रिगर के बाद तालिकाओं के साथ पंक्ति संस्करण जानकारी जोड़ने से बचता है।

यह यहाँ SQL कीवी द्वारा कवर किया गया है

संग्रहीत डेटा का वास्तविक आकार स्थिर है - यह संभावित आकार है जो मायने रखता है।

इसी तरह अगर 2016 के बाद से मेमोरी ऑप्टिमाइज़्ड टेबल्स का उपयोग किया जा रहा है, तो एलओबी कॉलम या कॉलम चौड़ाई के संयोजन का उपयोग करना संभव हो गया है जो संभावित रूप से एरो सीमा से अधिक हो सकता है लेकिन एक दंड के साथ।

(मैक्स) कॉलम हमेशा ऑफ-रो स्टोर किए जाते हैं। अन्य स्तंभों के लिए, यदि तालिका परिभाषा में डेटा पंक्ति का आकार 8,060 बाइट्स से अधिक हो सकता है, तो SQL सर्वर सबसे बड़ी परिवर्तनशील-लंबाई वाले कॉलम (एस) को बंद कर देता है। फिर, यह आपके द्वारा संग्रहीत डेटा की मात्रा पर निर्भर नहीं करता है।

यह स्मृति की खपत और प्रदर्शन पर एक बड़ा नकारात्मक प्रभाव डाल सकता है

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

SQL सर्वर इंजन में ही एक ऐसा ही मामला है कि जब SORTSQL सर्वर संचालन के लिए आवंटित करने के लिए स्मृति अनुदान की गणना करता है कि varchar(x)कॉलम औसत उपभोग x/2बाइट्स होगा।

यदि आपके अधिकांश varcharकॉलम इससे अधिक भरे हुए हैं, तो इससे sortऑपरेशनों को गति मिल सकती है tempdb

आपके मामले में यदि आपके varcharकॉलम को 8000बाइट्स के रूप में घोषित किया गया है, लेकिन वास्तव में इससे बहुत कम सामग्री है, तो आपकी क्वेरी को स्मृति आवंटित की जाएगी कि इसकी आवश्यकता नहीं है, जो स्पष्ट रूप से अक्षम है और स्मृति अनुदान के लिए इंतजार कर सकता है।

यह SQL वर्कशॉप वेबकास्ट 1 के भाग 2 में शामिल है जिसे यहां से डाउनलोड किया जा सकता है या नीचे देखें।

use tempdb;

CREATE TABLE T(
id INT IDENTITY(1,1) PRIMARY KEY,
number int,
name8000 VARCHAR(8000),
name500 VARCHAR(500))

INSERT INTO  T 
(number,name8000,name500)
SELECT number, name, name /*<--Same contents in both cols*/
FROM master..spt_values

SELECT id,name500
FROM T
ORDER BY number

स्क्रीनशॉट

SELECT id,name8000
FROM T
ORDER BY number

स्क्रीनशॉट


1
इसलिए, यदि मेरे लगभग सभी मूल्य 3 या 4 वर्ण हैं, तो कभी भी 4 वर्णों से अधिक नहीं हो सकते हैं, और मैं "tempdb के लिए छाँटे गए ऑपरेशन" से बचना चाहता हूं, मैं अपने कॉलम VARCHAR (8) की घोषणा करूंगा और उस कॉलम को लागू करने के लिए एक CHECST बाधा का उपयोग कर सकता हूं। चौड़ाई 4 वर्णों से अधिक नहीं हो सकती। तुम क्या सोचते हो?
एके

12
@AlexKuznetsov - उस स्थिति के लिए मैं उन्हें घोषित कर दूंगा क्योंकि char(4)वैसे भी चर स्तंभ प्रति 2 बाइट्स ओवरहेड है।
मार्टिन स्मिथ

9

सर्वोत्तम प्रथाओं के अलावा (BBlake का जवाब)

  • आपको DDL के साथ अधिकतम पंक्ति आकार (8060) बाइट्स और इंडेक्स चौड़ाई (900 बाइट्स) के बारे में चेतावनी मिलती है
  • यदि आप इन सीमाओं को पार कर जाते हैं तो DML मर जाएगी
  • एएनएसआई पैडिंग डिफ़ॉल्ट है, ताकि आप व्हाट्सएप के एक पूरे लोड को समाप्त कर सकें

38
एएनएसआई पैडिंग ऑन के बारे में स्पष्ट करने के लिए: उपयोग करते समय nvarcharऔर varcharटाइप करने के लिए, इसका मतलब यह है कि अनुगामी रिक्त स्थान सम्मिलित किए जाने पर संरक्षित हैं - ऐसा नहीं है कि मान स्तंभ के आकार के लिए रिक्त स्थान के साथ गद्देदार हैं, जैसे कि charऔर nchar
बेन एम

9

बड़े स्तंभों के कुछ नुकसान हैं जो थोड़े स्पष्ट हैं और आपको थोड़ी देर बाद पकड़ सकते हैं:

  • INDEX में आपके द्वारा उपयोग किए जाने वाले सभी कॉलम - 900 बाइट से अधिक नहीं होने चाहिए
  • ORDER BY क्लॉज के सभी कॉलम 8060 बाइट्स से अधिक नहीं हो सकते। यह पकड़ना थोड़ा मुश्किल है क्योंकि यह केवल कुछ कॉलमों पर लागू होता है। देखें एसक्यूएल 2008 R2 पंक्ति आकार सीमा को पार जानकारी के लिए)
  • यदि कुल पंक्ति का आकार 8060 बाइट्स से अधिक है, तो आपको उस पंक्ति के लिए " पृष्ठ स्पिल " मिलता है । यह प्रदर्शन को प्रभावित कर सकता है (एक पृष्ठ SQLServer में एक आवंटन इकाई है और 8000 बाइट्स + कुछ ओवरहेड पर तय किया गया है। यह अधिक होना गंभीर नहीं होगा, लेकिन यह ध्यान देने योग्य है और आपको इसे आसानी से बचने की कोशिश करनी चाहिए)
  • कई अन्य आंतरिक डेटास्ट्रक्चर, बफ़र्स और अंतिम-कम से कम आपके स्वयं के वैरिएबल और टेबल-चर सभी को इन आकारों को दर्पण करने की आवश्यकता होती है। अत्यधिक आकारों के साथ, अत्यधिक मेमोरी आवंटन प्रदर्शन को प्रभावित कर सकता है

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

व्यावसायिक नामों के अपने उदाहरण में, इस बारे में सोचें कि आपको उन्हें कहां प्रदर्शित करना है। क्या वाकई 500 पात्रों के लिए जगह है ?? यदि नहीं, तो उन्हें इस तरह संग्रहीत करने का कोई मतलब नहीं है। http://en.wikipedia.org/wiki/List_of_companies_of_the_United_States कुछ कंपनी नामों को सूचीबद्ध करता है और अधिकतम लगभग 50 वर्ण हैं। तो मैं कॉलम अधिकतम के लिए 100 का उपयोग करूंगा। शायद 80 की तरह।


2

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

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


सच है, यह एक बहुत बड़ी चिंता का विषय है। लेकिन आजकल, अंतरिक्ष वास्तव में सस्ता है, इसलिए मुझे नहीं लगता कि यह विचार के लिए एक बड़ी चिंता है, कम से कम मेरे दृष्टिकोण से।
BBlake

1
@jcollum: आपके उदाहरण में, 500 किसी व्यावसायिक नाम के लिए उचित आकार का नहीं लगता है।
ओटिस

1
@Blake: भंडारण की लागत के बावजूद, यदि SQL सर्वर में अभी भी पंक्ति आकार की कमी है, तो इससे कोई फर्क नहीं पड़ता कि आपके पास कितना संग्रहण है। आप टैक्स्टोब्लब्स में सब कुछ स्टोर कर सकते हैं, लेकिन कुछ SQL ऑपरेशन हैं जो आप एक ब्लूबेर पर नहीं कर सकते हैं जो कि आप एक वर्चर पर कर सकते हैं।
ओटिस

2
@Otis: मेरी बात यह है: व्यवसाय के नाम के आकार पर कोई वास्तविक बाधा नहीं है। जब तक कहीं कोई कानून नहीं है। तो उस स्थिति में मैं उस क्षेत्र में बदलाव (8000) करूंगा और उसे एक दिन कहूंगा। मेरी सोच इस तरह से है: असली बाधा? varchar (एक्स)। कोई वास्तविक अड़चन नहीं? varchar (8000)।
जूलम

24
मैंने सोचा कि 30 या तो चार शहर के नामों के लिए अच्छा था, जब तक कि मैंने एल प्यूब्लो डे
नुस्तेरा सनोरा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.