NVARCHAR (MAX) को संपीड़ित करने का वैकल्पिक तरीका?


14

मैं कुछ तालिकाओं को संकुचित करने की कोशिश कर रहा हूं जिनमें NVARCHAR(MAX)फ़ील्ड हैं। दुर्भाग्य से, rowऔर pageसंपीड़न का इच्छा प्रभाव नहीं है (केवल ~ 100/200 एमबी 20 जीबी टेबल के लिए बचाया गया है)। इसके अलावा, मैं कॉलम स्टोर और कॉलम स्टोर अभिलेखीय कंप्रेशन को लागू करने में सक्षम नहीं हूं क्योंकि वे NVARCHAR(MAX)खेतों के संपीड़न का समर्थन नहीं करते हैं।

क्या कोई बता सकता है कि क्या मेरा यहाँ कोई विकल्प है?

मैं भी लगता है rowऔर pageसंपीड़न प्रभाव नहीं है क्योंकि की सामग्री NVARCHAR(MAX)कॉलम अद्वितीय है।


2
क्या स्तंभ मूल्य निश्चित रूप से 8000 वर्णों से अधिक व्यापक हैं? उदाहरण के लिए सेलेक्ट मैक्स (CAST (LEN (वाइडकॉल्यूम) AS BIGINT)) से dbo.largeTable वरना आप उन्हें साधारण वर्कर में परिवर्तित कर सकते हैं और क्लस्टर किए गए कॉलमस्टोर को लागू कर सकते हैं।
wcb

@ व्हाट्सएप भले ही सबसे बड़ा मूल्य केवल 2000 वर्णों का हो, VARCHARयदि 1 से अधिक कोड पेज के अक्षरों का उपयोग किया जा रहा हो तो संभावित रूप से डेटा हानि का कारण नहीं होगा ? मुझे लगता है कि सलाह दी जानी चाहिए कि NVARCHAR(4000)अगर अधिकतम लंबाई 4000 से अधिक न हो, क्योंकि तब सभी मान पूर्ण यूनिकोड संपीड़न के लिए पात्र होंगे। फिर भी, इस प्रश्न में जानकारी से यह मान लेना सुरक्षित है कि मूल्य 4000 वर्णों से अधिक हैं, यही कारण है कि वे वर्तमान में संपीड़ित नहीं कर रहे हैं।
सोलोमन रटज़की

जवाबों:


16

पृष्ठ और पंक्ति संपीड़न दोनों ही BLOB को संपीड़ित नहीं करते हैं

उनके आकार के कारण, बड़े-मूल्य डेटा प्रकार कभी-कभी विशेष उद्देश्य पृष्ठों पर सामान्य पंक्ति डेटा से अलग संग्रहीत किए जाते हैं। डेटा संपीड़न अलग से संग्रहीत डेटा के लिए उपलब्ध नहीं है।

यदि आप BLOB को संपीड़ित करना चाहते हैं, तो आपको उन्हें पसंद के रूप में संग्रहीत करने VARBINARY(MAX)और अपनी स्ट्रीम संपीड़न एल्गोरिथम लागू करने की आवश्यकता है । उदाहरण के लिए GZipStream। ऐसा करने के लिए कई उदाहरण हैं, बस GZipStream और SQLCLR की खोज करें।


10

कस्टम संपीड़न को पूरा करने के लिए संभावित रूप से दो तरीके हैं:

  1. SQL सर्वर 2016 में शुरू होने वाले COMPRESS और DECOMPRESS के लिए अंतर्निहित कार्य हैं । ये फ़ंक्शन GZip एल्गोरिथ्म का उपयोग करते हैं।

  2. किसी भी एल्गोरिथ्म को लागू करने के लिए SQLCLR का उपयोग करें (जैसा कि @Remus उनके उत्तर में उल्लिखित है)। यह विकल्प SQL सर्वर 2016 से पहले के संस्करणों में उपलब्ध है, जो SQL Server 2005 में वापस जा रहा है।

    GZip एक आसान विकल्प है क्योंकि यह .NET के भीतर और समर्थित .NET फ्रेमवर्क लाइब्रेरी में उपलब्ध है (कोड SAFEअसेंबली में हो सकता है )। या, यदि आप GZip चाहते हैं, लेकिन इसे कोडिंग / तैनाती से निपटने के लिए नहीं चाहते हैं, तो आप Util_GZip और Util_GUnzip फ़ंक्शन का उपयोग कर सकते हैं जो SQL # SQLCLR लाइब्रेरी के नि: शुल्क संस्करण में उपलब्ध हैं (जो मैं लेखक हूं)।

    यदि आप GZip का उपयोग करने का निर्णय लेते हैं, तो क्या आप इसे स्वयं कोड करते हैं या SQL # का उपयोग करते हैं, कृपया ध्यान रखें कि GZip संपीड़न को बेहतर करने के लिए .NET में उपयोग किया जाने वाला एल्गोरिथ्म बेहतर तरीके से फ्रेमवर्क संस्करण 4.5 में बदल गया है (MSDN पर "रिमार्क्स" अनुभाग देखें) GZipStream क्लास के लिए पेज )। इसका मतलब है की:

    1. यदि आप SQL Server 2005, 2008, या 2008 R2 का उपयोग कर रहे हैं - सभी CLR v 2.0 से जुड़े हैं, जो फ्रेमवर्क संस्करण 2.0, 3.0 और 3.5 को संभालता है - तो फ्रेमवर्क संस्करण 4.5 में किए गए परिवर्तन का कोई प्रभाव नहीं पड़ता है और आप दुर्भाग्य से फंस गए हैं .NET का मूल, बेकार एल्गोरिथम।
    2. यदि आप SQL सर्वर 2012 या नए (अब तक 2014 और 2016) का उपयोग कर रहे हैं - सभी CLR v 4.0 से जुड़े हैं जो फ्रेमवर्क संस्करण 4.0, 4.5.x, 4.6 को संभालता है - तो आप नए, बेहतर एल्गोरिथ्म का उपयोग कर सकते हैं। एकमात्र आवश्यकता यह है कि आपने सर्वर पर SQL Server चलाने वाले .NET फ्रेमवर्क को 4.5 या नए संस्करण में अपडेट किया है।

    हालाँकि, आपको GZip का उपयोग करने की आवश्यकता नहीं है और किसी भी एल्गोरिथम को लागू करने के लिए स्वतंत्र हैं।

कृपया ध्यान दें: ऊपर वर्णित सभी विधियाँ वास्तविक प्रतिस्थापन होने के बजाय "वर्क-अराउंड" अधिक हैं, भले ही वे तकनीकी रूप से "एनवायचैर (मैक्स)" डेटा को संपीड़ित करने के वैकल्पिक तरीके हैं। अंतर यह है कि बिल्ट-इन डेटा संपीड़न के साथ - rowऔर page- SQL सर्वर द्वारा प्रस्तुत किया गया है, संपीड़न को पीछे के दृश्यों को संभाला जाता है और डेटा अभी भी प्रयोग करने योग्य, पठनीय और अनुक्रमित है। लेकिन किसी भी डेटा को एक VARBINARYसाधन में संपीड़ित करना जिससे आप अंतरिक्ष की बचत कर रहे हैं, लेकिन कुछ कार्यक्षमता दे रहे हैं। सच है, एक 20k स्ट्रिंग वैसे भी अनुक्रमित नहीं है, लेकिन यह अभी भी एक में इस्तेमाल किया जा सकता हैWHEREखंड, या किसी भी स्ट्रिंग फ़ंक्शन के साथ। कस्टम संपीड़ित मूल्य के साथ कुछ भी करने के लिए आपको इसे मक्खी पर गिराना होगा। द्विआधारी फ़ाइलों (पीडीएफ, जेपीईजी, आदि) को संपीड़ित करते समय यह एक गैर-मुद्दा है, लेकिन यह सवाल NVARCHARडेटा के लिए विशिष्ट था ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.