Cách khác để nén NVARCHAR (MAX)?


14

Tôi đang cố gắng nén một số bảng có NVARCHAR(MAX)các trường. Thật không may, việc nén rowpagenén không có tác động mong muốn (chỉ lưu ~ 100/200 MB cho bảng 20 GB). Ngoài ra, tôi không thể áp dụng nén lưu trữ cột và lưu trữ cột vì chúng không hỗ trợ nén các NVARCHAR(MAX)trường.

Bất cứ ai có thể cho biết nếu tôi có bất kỳ lựa chọn thay thế ở đây?

Tôi cũng đoán rowpagenén không có hiệu lực vì nội dung của các NVARCHAR(MAX)cột là duy nhất.


2
Các giá trị cột chắc chắn rộng hơn 8000 ký tự? ví dụ: CHỌN MAX (CAST (LEN (widecolumn) NHƯ LỚN)) TỪ dbo.largeTable Nếu không, bạn có thể chuyển đổi chúng thành varchar thông thường và áp dụng kho lưu trữ cột.
wBob

@wBob Ngay cả khi giá trị lớn nhất chỉ có 2000 ký tự, sẽ không chuyển đổi thành VARCHARcó khả năng gây mất dữ liệu nếu các ký tự từ hơn 1 Trang Mã đang được sử dụng? Tôi nghĩ rằng lời khuyên nên là chuyển đổi thành NVARCHAR(4000)nếu độ dài tối đa không lớn hơn 4000 vì khi đó tất cả các giá trị sẽ đủ điều kiện để nén Unicode đầy đủ. Tuy nhiên, có thể an toàn khi giả định từ thông tin trong Câu hỏi rằng các giá trị có hơn 4000 ký tự, đó là lý do tại sao chúng không nén.
Solomon Rutzky

Câu trả lời:


16

Cả nén trang và hàng đều không nén BLOB .

Do kích thước của chúng, các loại dữ liệu giá trị lớn đôi khi được lưu trữ riêng biệt với dữ liệu hàng thông thường trên các trang mục đích đặc biệt. Nén dữ liệu không có sẵn cho dữ liệu được lưu trữ riêng.

Nếu bạn muốn nén BLOB, bạn cần lưu trữ chúng VARBINARY(MAX)và áp dụng thuật toán nén luồng mà bạn chọn. Ví dụ GZipStream. Có nhiều ví dụ về cách thực hiện việc này, chỉ cần tìm kiếm GZipStream và SQLCLR.


10

Có (hiện tại) có hai cách để thực hiện nén tùy chỉnh:

  1. Bắt đầu trong SQL Server 2016, có các hàm dựng sẵn cho COMPRESSDECOMPRESS . Các hàm này sử dụng thuật toán GZip.

  2. Sử dụng SQLCLR để thực hiện bất kỳ thuật toán nào bạn chọn (như @Remus đã đề cập trong câu trả lời của anh ấy). Tùy chọn này có sẵn trong các phiên bản trước SQL Server 2016, sẽ quay trở lại SQL Server 2005.

    GZip là một lựa chọn dễ dàng vì nó có sẵn trong .NET trong các thư viện .NET Framework được hỗ trợ (mã có thể nằm trong một SAFEhội). Hoặc, nếu bạn muốn GZip nhưng không muốn xử lý mã hóa / triển khai nó, bạn có thể sử dụng các hàm Util_GZipUtil_GUnzip có sẵn trong phiên bản Miễn phí của thư viện SQL # SQLCLR (mà tôi là tác giả).

    Nếu bạn quyết định sử dụng GZip, cho dù bạn tự viết mã hay sử dụng SQL #, xin lưu ý rằng thuật toán được sử dụng trong .NET để thực hiện nén GZip trong phiên bản Framework 4.5 để tốt hơn (xem phần "Ghi chú" trên MSDN trang cho Lớp GZipStream ). Điều này có nghĩa là:

    1. Nếu bạn đang sử dụng SQL Server 2005, 2008 hoặc 2008 R2 - tất cả được liên kết với CLR v 2.0 xử lý các phiên bản Framework 2.0, 3.0 và 3.5 - thì thay đổi được thực hiện trong Framework phiên bản 4.5 không có hiệu lực và bạn không may bị mắc kẹt với Thuật toán gốc, sucky của .NET.
    2. Nếu bạn đang sử dụng SQL Server 2012 hoặc mới hơn (cho đến năm 2014 và 2016) - tất cả được liên kết với CLR v 4.0 xử lý các phiên bản Framework 4.0, 4.5.x, 4.6 - thì bạn có thể sử dụng thuật toán mới hơn, tốt hơn. Yêu cầu duy nhất là bạn đã cập nhật .NET Framework trên máy chủ đang chạy SQL Server thành phiên bản 4.5 trở lên.

    Tuy nhiên, bạn không phải sử dụng GZip và được tự do thực hiện bất kỳ thuật toán nào.

XIN LƯU Ý: tất cả các phương pháp được ghi chú ở trên là "giải pháp thay thế" thay vì là thay thế thực tế, mặc dù về mặt kỹ thuật chúng là "cách thay thế để nén dữ liệu NVARCHAR (MAX)". Sự khác biệt là với Nén dữ liệu tích hợp - rowpage- được cung cấp bởi SQL Server, việc nén được xử lý phía sau hậu trường và dữ liệu vẫn có thể sử dụng, có thể đọc và lập chỉ mục. Nhưng nén bất kỳ dữ liệu nào thành một VARBINARYphương tiện mà bạn đang tiết kiệm dung lượng, nhưng lại từ bỏ một số chức năng. Đúng, dù sao thì một chuỗi 20k không thể lập chỉ mục được, nhưng nó vẫn có thể được sử dụng trongWHEREmệnh đề, hoặc với bất kỳ hàm chuỗi nào. Để làm bất cứ điều gì với một giá trị nén tùy chỉnh, bạn sẽ cần phải giải nén nó một cách nhanh chóng. Khi nén các tệp nhị phân (PDF, JPEG, v.v.), đây không phải là vấn đề, nhưng câu hỏi này là dành riêng cho NVARCHARdữ liệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.