पृष्ठ संपीड़न का उपयोग करते समय पंक्ति ओवरहेड क्या है?


10

मैंने 650 न्यूमेरिक (19,4) कॉलम के साथ एक टेबल बनाया है। जब मैं चलकर, पृष्ठ संपीड़न पर स्विच करता हूँ

ALTER TABLE fct.MyTable REBUILD  WITH (DATA_COMPRESSION = PAGE);

मुझे मिला

Msg 1975, स्तर 16, राज्य 1
सूचकांक 'PK_Mytable' पंक्ति की लंबाई '8060' बाइट्स की अधिकतम अनुमेय लंबाई से अधिक है।

लेकिन 650 गुना 9 बाइट्स केवल 5850 बाइट्स हैं, जो कि 8060 बाइट्स की निर्धारित सीमा से काफी दूर है।

सर्वर SQL Server 2016 SP1 CU2 के साथ Windows 2012 r2 चला रहा है

पृष्ठ संपीड़न का उपयोग करते समय पंक्ति ओवरहेड क्या है?

यहाँ कुछ कोड दिखाने के लिए मैं क्या मतलब है:

/* test script to demo MSG 1975 */
DECLARE @sql NVARCHAR(max)='', @i INT =0
drop table if exists dbo.mytable;

SET @sql = 'Create table dbo.Mytable (MyTableID bigint not null 
  identity(1,1) primary key clustered, '

WHILE @i < 593 BEGIN
    SET @sql += ' Column' + LTRIM(@i) + ' numeric(19,4) null, '
    SET @i +=1
END

SET @sql += ' LastColumn int) '
--SET @sql += ' with (DATA_COMPRESSION = ROW) '
SET @sql += ' with (DATA_COMPRESSION = PAGE) '

SELECT @sql
EXEC sys.sp_executesql @sql

SELECT top 10000 * FROM dbo.MyTable MT

पंक्ति संपीड़न भी विफल रहता है, लेकिन एक अलग पंक्ति गणना में।


आपकी प्राथमिक कुंजी कितनी बड़ी है? यदि यह एक तथ्य तालिका है और आप प्रदर्शन को संपीड़ित और बढ़ाना चाहते हैं, तो मेरा सुझाव है कि आप कॉलमस्टोर इंडेक्स पर पढ़ें, वे काफी प्रभाव डाल सकते हैं। पृष्ठ संपीड़न का ओवरहेड डिकम्प्रेस करने के लिए अधिक सीपीयू उपयोग है।
स्टिजेन वेंट्सेंट्स

@StijnWynants; 8 बाइट्स BigInts के लिए उपयोग किया जाता है। यह वास्तव में एक तथ्य है, लेकिन कॉलमस्टोर इंडेक्स को वारंट करने के लिए पर्याप्त पंक्तियां नहीं हैं।
हेनरिक स्टॉउन पॉल्सेन

जवाबों:


13

यदि आप संकुल सारणी के बिना अपनी तालिका बनाने का प्रयास करते हैं, और आपको थोड़ी अलग त्रुटि मिलेगी:

Msg 1701, Level 16, State 1, Line 1 'Mytable' टेबल बनाना या बदलना विफल रहा क्योंकि न्यूनतम पंक्ति का आकार 8067 होगा, जिसमें आंतरिक ओवरहेड के 1530 बाइट्स शामिल हैं। यह अधिकतम स्वीकार्य तालिका पंक्ति का आकार 8060 बाइट्स से अधिक है।

इस त्रुटि संदेश में, आप देख सकते हैं कि पृष्ठ संपीड़न के लिए आंतरिक ओवरहेड की 1530 बाइट्स हैं।

अब, आप गणित कर सकते हैं:

  • bigintMyTableID के लिए 8 बाइट्स
  • intLastColumn के लिए 4 बाइट्स
  • 593 numeric(19,4)कॉलम में से प्रत्येक के लिए 9 बाइट्स (कुल 5337 बाइट्स)
  • संपीड़न उपरि के 1530 बाइट्स

तो, 8 + 4 + (593 * 9) + 1530 = 6879। एक सेकंड रुको .... यह अभी भी 8060 से नीचे है उस के साथ क्या हो रहा है ?!


पेज संपीड़न एल्गोरिथ्म वास्तव में एक साथ कई संपीड़न एल्गोरिदम को ढेर करता है। पहला कदम ROW संपीड़न लागू करना है। उस त्रुटि संदेश में सूचीबद्ध 1530 बाइट्स में पंक्ति संपीड़न का ओवरहेड शामिल नहीं है।

आप इस बारे में अधिक पढ़ सकते हैं कि मेरे ब्लॉग पर और यहाँ BOL में पंक्ति संपीड़न कैसे काम करता है । आप BOL लेख में ध्यान देंगे कि यह numericभंडारण का वर्णन करता है "यह संग्रहण ठीक वर्डेसीमल भंडारण प्रारूप के समान है," लेकिन व्याख्या नहीं करता है vardecimalयह पोस्टvardecimal थोड़ा अधिक कवर करती है - अनिवार्य रूप से, यह वास्तविक लंबाई को स्टोर करने के लिए प्रति कॉलम ओवरहेड के 2 बाइट्स जोड़ता है (जो varcharजैसा करता है)।

पंक्ति संपीड़न को 593 numericकॉलमों में से प्रत्येक के लिए अतिरिक्त 2 बाइट्स की आवश्यकता होगी , प्लस bigintऔर intप्रत्येक के ऊपर 1 बाइट की आवश्यकता होगी।

पंक्ति संकुचित भंडारण आवश्यकताओं होगा:

  • bigintMyTableID के लिए 8 बाइट्स + 1 बाइट ओवरहेड
  • intLastColumn के लिए 4 बाइट्स + 1 बाइट ओवरहेड
  • 593 numeric(19,4)कॉलम में से प्रत्येक के लिए 9 बाइट्स + 2 बाइट्स ओवरहेड
  • ROW संपीड़न ओवरहेड के 1188 बाइट्स

8 + 4 + (593 * 9) = 5349 बाइट्स डेटा

1 + 1 + (593 * 2) = 1188 बाइट्स पंक्ति संपीड़न ओवरहेड

पंक्ति-संकुचित स्कीमा के लिए कुल 6537 बाइट्स


अब जब हमारे पास पंक्ति-संकुचित स्कीमा के लिए पंक्ति आकार है, तो हम अपने गणित को फिर से देख सकते हैं। पृष्ठ-संकुचित पंक्ति आकार डेटा आकार + पंक्ति संपीड़न ओवरहेड + पृष्ठ संपीड़न ओवरहेड होगा:

  • bigintMyTableID के लिए 8 बाइट्स
  • intLastColumn के लिए 4 बाइट्स
  • 593 numeric(19,4)कॉलम में से प्रत्येक के लिए 9 बाइट्स
  • ROW संपीड़न ओवरहेड के 1188 बाइट्स
  • पृष्ठ संपीड़न ओवरहेड के 1530 बाइट्स
  5349 बाइट्स डेटा 
+ 1188 बाइट्स पंक्ति संपीड़न ओवरहेड 
+ 1530 बाइट्स पृष्ठ संपीड़न ओवरहेड 

कुल 8067 बाइट्स


1
मुझे आपका निष्कर्ष पसंद है: "ज्यादातर मामलों में, आप पाएंगे कि पंक्ति संपीड़न कुछ स्थान बचाने में सक्षम है - लेकिन हमेशा नहीं।" ओवरहेड के 2718 बाइट्स मेरी अपेक्षा बहुत अधिक हैं। इतना विस्तृत उत्तर लिखने के लिए समय निकालने के लिए आपका बहुत-बहुत धन्यवाद।
हेनरिक स्टॉउन पोल्सेन

1
@HenrikStaunPoulsen याद रखने के लिए एक अतिरिक्त महत्वपूर्ण बात यह है कि SQL सर्वर को यह मानने की आवश्यकता है कि आपका डेटा संपीड़ित नहीं हो सकता है। तो भले ही आपका डेटा 8060 बाइट्स से कम हो, लेकिन SQL सर्वर को अनचाहे डेटा के लिए सैद्धांतिक अधिकतम पंक्ति आकार के आधार पर पंक्ति आकार की गणना करनी होगी।
AMtwo

3 दिनों के बाद, मैं अभी भी रो संपीड़न के लिए आवश्यक बाइट्स की संख्या से चकित हूं; प्रति कॉलम 2 बाइट्स। पृष्ठ संपीड़न उसके ऊपर लगभग 3 बाइट जोड़ता है। परंतु; आपके सहयोग के लिए धन्यवाद। यह सबसे उपयोगी था।
हेनरिक स्टॉउन पॉल्सेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.