Есть (сейчас) потенциально два способа выполнить пользовательское сжатие:
Начиная с 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
означает, что вы экономите место, но отказываетесь от некоторых функций. Правда, строка 20 КБ в любом случае не индексируется, но все же ее можно использовать вWHERE
предложение, или с любыми строковыми функциями. Чтобы сделать что-либо с пользовательским сжатым значением, вам нужно будет распаковать его на лету. При сжатии бинарных файлов (PDF, JPEG и т. Д.) Это не проблема, но этот вопрос относится только к NVARCHAR
данным.