Існує (зараз) потенційно два способи досягти спеціального стиснення:
Починаючи з SQL Server 2016, є вбудовані функції для COMPRESS та DECOMPRESS . Ці функції використовують алгоритм GZip.
Використовуйте 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 ). Це означає:
- Якщо ви використовуєте SQL Server 2005, 2008 або 2008 R2 - всі вони пов'язані з CLR v 2.0, який обробляє Framework версії 2.0, 3.0 та 3.5 - то зміна, внесена в Framework версії 4.5, не впливає, і ви, на жаль, затрималися Оригінальний, вдалий алгоритм .NET.
- Якщо ви використовуєте 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
даних.