एक उदाहरण जहां इससे फर्क पड़ सकता है वह यह है कि यह एक प्रदर्शन अनुकूलन को रोक सकता है जो ट्रिगर के साथ तालिका में पंक्ति संस्करण जानकारी जोड़ने से बचता है।
इसे पॉल व्हाइट ने यहां कवर किया है
<ब्लॉकक्वॉट>संग्रहीत डेटा का वास्तविक आकार महत्वहीन है - यह क्षमता का आकार है जो मायने रखता है।
इसी तरह अगर 2016 से मेमोरी ऑप्टिमाइज्ड टेबल का उपयोग कर रहे हैं तो एलओबी कॉलम या कॉलम चौड़ाई के संयोजन का उपयोग करना संभव है जो संभावित रूप से इनरो सीमा से अधिक हो सकता है लेकिन जुर्माना के साथ।
<ब्लॉकक्वॉट>(अधिकतम) कॉलम हमेशा ऑफ-पंक्ति संग्रहीत किए जाते हैं। अन्य स्तंभों के लिए, यदि तालिका परिभाषा में डेटा पंक्ति का आकार 8,060 बाइट्स से अधिक हो सकता है, तो SQL सर्वर सबसे बड़े चर-लंबाई वाले कॉलम को ऑफ-पंक्ति में धकेलता है। फिर, यह आपके द्वारा वहां संग्रहीत डेटा की मात्रा पर निर्भर नहीं करता है।
यह स्मृति खपत और प्रदर्शन पर बड़ा नकारात्मक प्रभाव डाल सकता है
एक और मामला जहां कॉलम की चौड़ाई घोषित करने से बड़ा अंतर आ सकता है, यदि तालिका को कभी भी एसएसआईएस का उपयोग करके संसाधित किया जाएगा। परिवर्तनीय लंबाई (गैर बीएलओबी) कॉलम के लिए आवंटित स्मृति निष्पादन पेड़ में प्रत्येक पंक्ति के लिए तय की जाती है और कॉलम की घोषित अधिकतम लंबाई के अनुसार होती है जिससे मेमोरी बफर (उदाहरण) का अक्षम उपयोग हो सकता है। जबकि एसएसआईएस पैकेज डेवलपर स्रोत से छोटे कॉलम आकार की घोषणा कर सकता है, यह विश्लेषण सबसे अच्छा सामने किया जाता है और वहां लागू किया जाता है।
SQL सर्वर इंजन में वापस एक समान मामला यह है कि SORT
के लिए आवंटित करने के लिए स्मृति अनुदान की गणना करते समय संचालन SQL सर्वर मानता है कि 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