यह तालिकाओं और अनुक्रमित के आकार को कम कर सकता है (जोर दिया)
आकार में कमी केवल तभी संभव है सबसे पात्रों में से अनिवार्य रूप से कर रहे हैं [space], 0 - 9, A - Z, a - z, और कुछ बुनियादी विराम चिह्न। वर्णों के उस विशिष्ट सेट के बाहर (व्यावहारिक उपयोग की शर्तों में, मानक ASCII मान 32 - 126), आप आकार में सबसे अच्छा बराबर NVARCHAR/ UTF-16, या कई मामलों में बड़े होंगे।
मैं डेटा को माइग्रेट करने की योजना बना रहा हूं क्योंकि मेरा मानना है कि कम डेटा पढ़ने से सिस्टम के लिए बेहतर प्रदर्शन होगा।
सावधान रहे। UTF-8 एक जादू नहीं है "सब कुछ ठीक करें" स्विच। अन्य सभी चीजें समान हैं, हां, कम पढ़ने से प्रदर्शन में सुधार होता है। लेकिन यहां "अन्य सभी चीजें" समान नहीं हैं । यहां तक कि केवल मानक ASCII वर्णों को संग्रहीत करते समय (जिसका अर्थ है: सभी वर्ण 1 बाइट हैं, इसलिए स्टोर करने की तुलना में आधे स्थान की आवश्यकता होती है NVARCHAR), UTF-8 का उपयोग करने के लिए मामूली प्रदर्शन जुर्माना है। मेरा मानना है कि यह समस्या यूटीएफ -8 के परिवर्तनशील लंबाई वाले एन्कोडिंग के कारण है, जिसका अर्थ है कि प्रत्येक बाइट की व्याख्या की जानी चाहिए क्योंकि यह जानने के लिए पढ़ा जाता है कि क्या यह एक पूर्ण चरित्र है या यदि अगला बाइट इसका एक हिस्सा है। इसका मतलब है कि सभी स्ट्रिंग ऑपरेशनों को शुरुआत में शुरू करने और बाइट-बाय-बाइट की आवश्यकता है। दूसरी ओर,NVARCHAR / UTF-16 हमेशा 2 बाइट्स होता है (यहां तक कि अनुपूरक वर्ण भी दो 2-बाइट कोड पॉइंट्स से युक्त होते हैं), इसलिए 2-बाइट विखंडू में सब कुछ पढ़ा जा सकता है।
मेरे परीक्षण में, यहां तक कि केवल मानक ASCII वर्णों के साथ, डेटा को UTF-8 के रूप में संग्रहीत करने से बीता समय की कोई बचत नहीं हुई, लेकिन निश्चित रूप से CPU समय के लिए बदतर था। और वह डेटा कम्प्रेशन के बिना था, इसलिए कम से कम डिस्क स्थान का उपयोग किया गया था। लेकिन, संपीड़न का उपयोग करते समय, UTF-8 के लिए आवश्यक स्थान केवल 1% था - 1.5% छोटा। तो प्रभावी रूप से कोई अंतरिक्ष बचत UTF-8 के लिए अभी तक उच्च CPU समय नहीं है।
NVARCHAR(MAX)यूनिकोड संपीड़न के बाद से चीजें अधिक जटिल हो जाती हैं क्योंकि यह डेटाटाइप के साथ काम नहीं करता है, भले ही मूल्य पंक्ति में संग्रहीत होने के लिए पर्याप्त छोटा हो। लेकिन, यदि डेटा काफी छोटा है, तो इसे अभी भी रो या पेज संपीड़न (जिस स्थिति में यह वास्तव में UTF-8 से तेज हो जाता है) से लाभ होना चाहिए। हालाँकि, ऑफ-रो डेटा किसी भी संपीड़न का उपयोग नहीं कर सकता है। फिर भी, तालिका को एक क्लस्टर्ड कॉलमस्टोरस्टोर इंडेक्स बनाने से इसका आकार बहुत कम हो जाता है NVARCHAR(MAX)(भले ही यह अभी भी UTF-8 से थोड़ा बड़ा हो, जब क्लस्टर किए गए कॉलम के आधार पर इंडेक्स का उपयोग किया जाता है)।
क्या कोई व्यक्ति परिदृश्य और कारण को इंगित कर सकता है, यूटीएफ एन्कोडिंग के साथ चार डेटा प्रकारों का उपयोग करने के लिए नहीं
निश्चित रूप से। वास्तव में, मैं वास्तव में इसे ज्यादातर मामलों में उपयोग करने के लिए एक सम्मोहक कारण नहीं ढूंढता। एकमात्र परिदृश्य जो वास्तव में UTF-8 से लाभान्वित होता है:
- डेटा ज्यादातर मानक ASCII है (मान 0 - 127)
- इसे यूनिकोड होने की आवश्यकता है क्योंकि इसे किसी एकल 8-बिट कोड पृष्ठ (यानी ) पर उपलब्ध वर्णों की एक विस्तृत श्रृंखला को संग्रहीत करने की आवश्यकता हो सकती है
VARCHAR
- अधिकांश डेटा ऑफ-रो स्टोर किया जाता है (इसलिए पृष्ठ संपीड़न भी काम नहीं करता है)
- आपके पास पर्याप्त डेटा है जिसकी आपको आवश्यकता है / गैर-क्वेरी-प्रदर्शन कारणों के लिए आकार कम करना चाहता है (जैसे बैकअप आकार कम करना, बैकअप के लिए आवश्यक समय कम करना / पुनर्स्थापित करना, आदि)
- आप Clustered Columnstore Index का उपयोग नहीं कर सकते हैं (शायद तालिका का उपयोग इस मामले में प्रदर्शन को बदतर बनाता है?)
मेरे परीक्षण से पता चलता है कि लगभग सभी मामलों में, NVARCHAR तेज था, खासकर जब अधिक डेटा था। वास्तव में, 21k पंक्तियों के साथ औसतन 5k वर्ण प्रति पंक्ति में यूटीएफ -8 के लिए 165 एमबी और NVARCHARअसम्पीडित के लिए 236 एमबी की आवश्यकता होती है । और फिर भी NVARCHARबीते समय में 2x अधिक तेज था, और सीपीयू समय में कम से कम 2x तेज (कभी-कभी अधिक)। फिर भी, इसने डिस्क पर 71 एमबी अधिक लिया।
उस के बाहर, मैं अभी भी UTF-8 का उपयोग करने की सिफारिश नहीं करूंगा, कम से कम CTP 2 के रूप में, विभिन्न प्रकार के बग के कारण जो मुझे इस सुविधा में मिला है।
इस नई सुविधा के विस्तृत विश्लेषण के लिए, जिसमें UTF-16 और UTF-8 के बीच अंतर और उन बगों की एक सूची शामिल है, कृपया मेरी पोस्ट देखें:
SQL Server 2019 में मूल निवासी UTF-8 समर्थन: उद्धारकर्ता या गलत पैगंबर?