यह बस संभव नहीं है। देखें इनसाइड द स्टोरेज इंजन:एनाटॉमी ऑफ़ ए रिकॉर्ड
मान लें कि आपकी टेबल कुछ इस तरह है।
CREATE TABLE T1(
col_1 varchar(8000) NULL,
col_2 varchar(8000) NULL,
/*....*/
col_999 varchar(8000) NULL,
col_1000 varchar(8000) NULL
)
फिर एक पंक्ति भी जिसमें सभी NULL
. हों मान निम्न संग्रहण का उपयोग करेंगे।
- 1 बाइट स्थिति बिट A
- 1 बाइट स्थिति बिट बी
- 2 बाइट कॉलम गिनती ऑफ़सेट
- 125 बाइट्स
NULL_BITMAP
(1bit
1,000 कॉलम के लिए प्रति कॉलम)
तो यह एक गारंटीकृत 129 बाइट्स है जो पहले ही उपयोग हो चुके हैं (7,931 को छोड़कर)।
यदि किसी भी कॉलम का मान NULL
नहीं है, तो या एक खाली स्ट्रिंग तो आपको
- 2 बाइट्स परिवर्तनीय लंबाई कॉलम गिनती (7,929 को छोड़कर)।
- कॉलम ऑफ़सेट सरणी के लिए 2 - 2000 बाइट्स के बीच कहीं भी।
- डेटा ही।
स्तंभ ऑफ़सेट सरणी प्रति चर लंबाई स्तंभ को छोड़कर . में 2 बाइट्स की खपत करती है यदि वह कॉलम और बाद के सभी कॉलम भी शून्य लंबाई के हैं। इसलिए col_1000
को अपडेट कर रहे हैं col_1
. को अपडेट करते समय पूरे 2000 बाइट्स का उपयोग करने के लिए बाध्य करेगा केवल 2 बाइट्स का उपयोग करेगा।
तो आप प्रत्येक कॉलम को 5 बाइट्स डेटा के साथ पॉप्युलेट कर सकते हैं और कॉलम ऑफ़सेट सरणी में प्रत्येक 2 बाइट्स को ध्यान में रखते हुए 7,000 बाइट्स तक जोड़ सकते हैं जो शेष 7,929 के भीतर है।
हालाँकि आप जो डेटा स्टोर कर रहे हैं वह 102 बाइट्स (51 nvarchar
.) है वर्ण) ताकि इसे पंक्ति में शेष वास्तविक डेटा के लिए 24 बाइट पॉइंटर के साथ पंक्ति से दूर संग्रहीत किया जा सके।
FLOOR(7929/(24 + 2)) = 304
तो सबसे अच्छा मामला यह होगा कि आप इस लंबाई के डेटा के 304 कॉलम स्टोर कर सकते हैं और वह यह है कि यदि आप col_1
से अपडेट कर रहे हैं , col_2
, ...
. अगर col_1000
डेटा है तो गणना है
FLOOR(5929/24) = 247
NTEXT
के लिए गणना समान है सिवाय यह एक 16 बाइट सूचक का उपयोग कर सकता है
जो आपको कुछ अतिरिक्त कॉलम में डेटा को निचोड़ने की अनुमति देगा
FLOOR(7929/(16 + 2)) = 440
किसी भी SELECT
. के लिए इन सभी ऑफ रो पॉइंटर्स का पालन करने की आवश्यकता है तालिका के विरुद्ध प्रदर्शन के लिए अत्यधिक हानिकारक होने की संभावना है।
इसका परीक्षण करने के लिए स्क्रिप्ट
DROP TABLE T1
/* Create table with 1000 columns*/
DECLARE @CreateTableScript nvarchar(max) = 'CREATE TABLE T1('
SELECT @CreateTableScript += 'col_' + LTRIM(number) + ' VARCHAR(8000),'
FROM master..spt_values
WHERE type='P' AND number BETWEEN 1 AND 1000
ORDER BY number
SELECT @CreateTableScript += ')'
EXEC(@CreateTableScript)
/* Insert single row with all NULL*/
INSERT INTO T1 DEFAULT VALUES
/*Updating first 304 cols succeed. Change to 305 and it fails*/
DECLARE @UpdateTableScript nvarchar(max) = 'UPDATE T1 SET '
SELECT @UpdateTableScript += 'col_' + LTRIM(number) + ' = REPLICATE(1,1000),'
FROM master..spt_values
WHERE type='P' AND number BETWEEN 1 AND 304
ORDER BY number
SET @UpdateTableScript = LEFT(@UpdateTableScript,LEN(@UpdateTableScript)-1)
EXEC(@UpdateTableScript)