ทางเลือกอื่นในการบีบอัด NVARCHAR (MAX)?


14

ฉันกำลังพยายามบีบอัดตารางที่มีNVARCHAR(MAX)เขตข้อมูล น่าเสียดายที่rowการpageบีบอัดข้อมูลไม่มีผลกระทบต่อความปรารถนา (บันทึกเพียง ~ 100/200 MB สำหรับตาราง 20 GB) นอกจากนี้ฉันไม่สามารถใช้การบีบอัดที่เก็บคอลัมน์และที่เก็บคอลัมน์ได้เนื่องจากพวกเขาไม่สนับสนุนการบีบอัดNVARCHAR(MAX)ฟิลด์

มีใครบอกได้ไหมว่าฉันมีทางเลือกอื่น ๆ ที่นี่?

ฉันเดาด้วยrowและการpageบีบอัดไม่มีผลเพราะเนื้อหาของNVARCHAR(MAX)คอลัมน์นั้นไม่เหมือนใคร


2
ค่าคอลัมน์มีความกว้างมากกว่า 8000 อักขระอย่างแน่นอนหรือไม่ เช่น SELECT MAX (CAST (LEN (widecolumn) เป็น BIGINT)) จาก dbo.largeTable มิฉะนั้นคุณสามารถแปลงมันเป็น varchar สามัญและใช้คอลัมน์แบบคลัสเตอร์
wBob

@wBob แม้ว่าค่าที่มากที่สุดเป็นเพียง 2,000 ตัวอักษร แต่จะไม่แปลงVARCHARเป็นสาเหตุของการสูญหายของข้อมูลหากมีการใช้อักขระจากหน้ารหัสมากกว่า 1 หน้า? ฉันคิดว่าคำแนะนำควรเปลี่ยนเป็นNVARCHAR(4000)ถ้าความยาวสูงสุดไม่เกิน 4000 เพราะค่าทั้งหมดจะมีสิทธิ์สำหรับการบีบอัด Unicode แบบเต็ม ถึงกระนั้นก็อาจจะปลอดภัยที่จะสันนิษฐานจากข้อมูลในคำถามว่าค่ามีความยาวมากกว่า 4,000 ตัวอักษรซึ่งเป็นเหตุผลว่าทำไมพวกเขาจึงไม่บีบอัดข้อมูล
โซโลมอน Rutzky

คำตอบ:


16

หน้าทั้งสองและการบีบอัดแถวทำ BLOBs

เนื่องจากขนาดของข้อมูลบางประเภทข้อมูลขนาดใหญ่จึงถูกจัดเก็บแยกต่างหากจากข้อมูลแถวปกติในหน้าวัตถุประสงค์พิเศษ การบีบอัดข้อมูลไม่พร้อมใช้งานสำหรับข้อมูลที่จัดเก็บแยกต่างหาก

หากคุณต้องการบีบอัด BLOB คุณต้องจัดเก็บเป็นVARBINARY(MAX)และใช้อัลกอริทึมการบีบอัดข้อมูลที่คุณต้องการ GZipStreamเช่น มีตัวอย่างมากมายวิธีการนี้เพียงแค่ค้นหา GZipStream และ SQLCLR


10

มีสองวิธีที่จะทำให้การบีบอัดแบบกำหนดเองประสบความสำเร็จ:

  1. เริ่มต้นใน SQL Server 2016 มีฟังก์ชั่นสำหรับการบีบอัดและขยาย ฟังก์ชั่นเหล่านี้ใช้อัลกอริทึม GZip

  2. ใช้ SQLCLR เพื่อใช้อัลกอริทึมที่คุณเลือก (ดังที่ @Remus พูดถึงในคำตอบของเขา) ตัวเลือกนี้มีอยู่ในรุ่นก่อนหน้า SQL Server 2016 ไปจนถึง SQL Server 2005

    GZip เป็นตัวเลือกที่ง่ายเนื่องจากมีอยู่ใน. NET และในไลบรารี. NET Framework ที่รองรับ (รหัสสามารถอยู่ในชุดSAFEประกอบ) หรือถ้าคุณต้องการ GZip แต่ไม่ต้องการจัดการกับการเข้ารหัส / ปรับใช้คุณสามารถใช้ฟังก์ชัน Util_GZipและUtil_GUnzipที่มีอยู่ในไลบรารีSQL # SQLCLR เวอร์ชันฟรี(ซึ่งฉันเป็นผู้เขียน)

    หากคุณตัดสินใจที่จะใช้ GZip ไม่ว่าคุณจะใช้รหัสด้วยตนเองหรือใช้ SQL # โปรดทราบว่าอัลกอริทึมที่ใช้ใน. NET เพื่อทำการบีบอัด GZip เปลี่ยนใน Framework รุ่น 4.5 ให้ดีขึ้น (ดูหัวข้อ "หมายเหตุ" ใน MSDN หน้าสำหรับGZipStream Class ) หมายความว่า:

    1. หากคุณใช้ SQL Server 2005, 2008 หรือ 2008 R2 - ทั้งหมดเชื่อมโยงกับ CLR v 2.0 ซึ่งจัดการ Framework เวอร์ชัน 2.0, 3.0 และ 3.5 - ดังนั้นการเปลี่ยนแปลงที่ทำใน Framework เวอร์ชัน 4.5 จะไม่มีผลกระทบใด ๆ และคุณติดอยู่กับที่ อัลกอริทึมดั้งเดิมของ sucky .NET
    2. หากคุณใช้ SQL Server 2012 หรือใหม่กว่า (จนถึงปี 2014 และ 2016) - ทั้งหมดเชื่อมโยงกับ CLR v 4.0 ซึ่งจัดการ Framework เวอร์ชัน 4.0, 4.5.x, 4.6 - คุณสามารถใช้อัลกอริทึมที่ใหม่กว่าและดีกว่า ข้อกำหนดเพียงอย่างเดียวคือคุณได้อัพเดต. NET Framework บนเซิร์ฟเวอร์ที่รัน SQL Server เป็นเวอร์ชัน 4.5 หรือใหม่กว่า

    อย่างไรก็ตามคุณไม่จำเป็นต้องใช้ GZip และสามารถใช้อัลกอริทึมใด ๆ ได้ฟรี

โปรดทราบ:วิธีการทั้งหมดที่กล่าวถึงข้างต้นมีมากกว่าดังนั้น "การแก้ไข" แทนที่จะเป็นการแทนที่จริงแม้ว่าจะเป็นเทคนิค "ทางเลือกในการบีบอัดข้อมูล NVARCHAR (MAX)" ความแตกต่างคือด้วยการบีบอัดข้อมูลในตัว - rowและpage- เสนอโดย SQL Server การบีบอัดจะถูกจัดการเบื้องหลังและข้อมูลยังคงใช้งานได้อ่านและจัดทำดัชนีได้ แต่การบีบอัดข้อมูลใด ๆ ลงในVARBINARYวิธีการที่คุณประหยัดพื้นที่ แต่เลิกฟังก์ชั่นบางอย่าง จริงสตริง 20k นั้นไม่สามารถจัดทำดัชนีได้ แต่ก็ยังสามารถใช้ในWHEREประโยคหรือฟังก์ชั่นสตริงใด ๆ เพื่อที่จะทำอะไรกับค่าที่บีบอัดแบบกำหนดเองคุณจะต้องคลายการบีบอัดทันที เมื่อทำการบีบอัดไฟล์ไบนารี่ (PDF, JPEG, ฯลฯ ) นี่ไม่ใช่ปัญหา แต่คำถามนี้เฉพาะกับNVARCHARข้อมูล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.