Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर के आसपास काम करें अधिकतम कॉलम 1024 और 8kb रिकॉर्ड आकार सीमित करें

यह बस संभव नहीं है। देखें इनसाइड द स्टोरेज इंजन:एनाटॉमी ऑफ़ ए रिकॉर्ड

मान लें कि आपकी टेबल कुछ इस तरह है।

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 (1 bit 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)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं तालिका में सभी कॉलम कैसे सूचीबद्ध करूं?

  2. क्या मैं प्रत्येक n सेकंड में एक संग्रहित प्रो को कॉल करने के लिए SQL सर्वर प्राप्त कर सकता हूं?

  3. SQL सर्वर में XML सम्मिलित करते समय एन्कोडिंग त्रुटि को स्विच करने में असमर्थ कैसे हल करें?

  4. SQL LIKE स्टेटमेंट में वेरिएबल का उपयोग करना

  5. एसक्यूएल पहुंच के न्यूनतम अनुक्रमिक दिनों का निर्धारण करने के लिए?