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

SQL सर्वर अधिकतम पंक्ति आकार बनाम वर्चर (अधिकतम) आकार

Microsoft SQL सर्वर में, डेटा (जिसमें अनुक्रमणिका शामिल है) एक या अधिक 8k (8192 बाइट्स) "पृष्ठों" में संग्रहीत होते हैं। विभिन्न प्रकार के पृष्ठ हैं जिनका उपयोग विभिन्न स्थितियों (जैसे डेटा, एलओबी, इंडेक्स, आवंटन मैप, आदि) को संभालने के लिए किया जा सकता है। प्रत्येक पृष्ठ में एक शीर्षलेख होता है जो उस पृष्ठ के बारे में मेटा-डेटा होता है और इसमें क्या होता है।

अधिकांश डेटा पंक्ति में ही संग्रहीत किया जाता है, और इनमें से एक या अधिक पंक्तियों को "इन-पंक्ति डेटा" के लिए एक पृष्ठ में संग्रहीत किया जाता है। पंक्ति शीर्षलेख द्वारा लिए गए स्थान के कारण, सबसे बड़ी पंक्ति ("इन-पंक्ति" डेटा के लिए) 8060 बाइट्स हो सकती है।

हालाँकि, सभी डेटा पंक्ति में संग्रहीत नहीं होते हैं। कुछ डेटाटाइप के लिए, डेटा वास्तव में "LOB डेटा" पृष्ठ पर संग्रहीत किया जा सकता है जबकि "इन-पंक्ति" डेटा में एक पॉइंटर छोड़ दिया जाता है:

  • विरासती / बहिष्कृत LOB प्रकार जिनका अब किसी को उपयोग नहीं करना चाहिए (TEXT , NTEXT , और IMAGE ), डिफ़ॉल्ट रूप से, अपने डेटा को हमेशा LOB पेज पर स्टोर करें और हमेशा उस LOB पेज पर 16-बाइट पॉइंटर का उपयोग करें।

  • नए LOB प्रकार (VARCHAR(MAX) , NVARCHAR(MAX) , VARBINARY(MAX) , और XML ), डिफ़ॉल्ट रूप से, डेटा को सीधे पंक्ति में फ़िट करने का प्रयास करेगा यदि वह फिट होगा। अन्यथा यह डेटा को LOB पृष्ठों पर संग्रहीत करेगा और 24 - 72 बाइट्स (LOB डेटा के आकार के आधार पर) के सूचक का उपयोग करेगा।

इस प्रकार आप 78 जीबी + 4 बाइट्स तक स्टोर कर सकते हैं (INT के बारे में नहीं भूल सकते प्राथमिक कुंजी;-) एक पंक्ति में:अधिकतम पंक्ति आकार 940 बाइट्स ((39 * 24) + 4) और 2812 बाइट्स ((39 * 72) + 4) के बीच होगा। लेकिन फिर, वह अधिकतम सीमा है; यदि 39 VARCHAR(MAX) . में से प्रत्येक में डेटा फ़ील्ड केवल 10 बाइट्स हैं, तो सभी डेटा इन-पंक्ति में संग्रहीत किया जाएगा और पंक्ति का आकार 394 बाइट्स ((39 * 10) + 4) होगा।

यह देखते हुए कि आपके पास बहुत से चर-लंबाई वाले फ़ील्ड हैं (चाहे वे MAX हों या नहीं), भविष्य की पंक्तियों के आकार का अनुमान लगाने का एकमात्र तरीका यह है कि आप इस तालिका में कौन सा डेटा संग्रहीत करेंगे, इसके बारे में एक अच्छा विचार होना चाहिए। हालांकि, सभी के साथ एक तालिका, या यहां तक ​​कि अधिकतर, MAX डेटाटाइप का तात्पर्य है कि किसी को भी वास्तव में पता नहीं है कि इस तालिका में क्या संग्रहीत किया जा रहा है।

उन पंक्तियों के साथ, यह इंगित किया जाना चाहिए कि यह MAX डेटाटाइप फ़ील्ड का एक भयानक रूप से मॉडलिंग टेबल/भयानक उपयोग है, और इसे दोबारा किया जाना चाहिए।

डेटा पेज कैसे संरचित होते हैं, इसके बारे में अधिक जानकारी के लिए, कृपया निम्नलिखित DBA.StackExchange प्रश्न का मेरा उत्तर देखें:

DATALENGTH का योग sys.allocation_units से तालिका आकार से मेल नहीं खाता



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं MS SQL सर्वर में किसी तालिका को किसी अन्य फ़ाइल समूह में कैसे स्थानांतरित कर सकता हूँ?

  2. SQL कॉलम में सीमांकित मानों को कई पंक्तियों में विभाजित करना

  3. डेटाबेस से .NET कॉन्फ़िगरेशन पढ़ें

  4. CTE से तालिका में रिकॉर्ड अपडेट करें

  5. एसक्यूएल:संग्रहीत प्रक्रिया में खंड में:मूल्यों को कैसे पास करें