Я пытаюсь сжать некоторые таблицы, которые имеют NVARCHAR(MAX)
поля. К сожалению, row
и page
сжатие не имеет влияние желания (только ~ 100/200 MB сохраненное на 20 Гб таблицы). Кроме того, я не могу применить архивное сжатие хранилища столбцов и хранилищ столбцов, поскольку они не поддерживают сжатие NVARCHAR(MAX)
полей.
Может кто-нибудь сказать, есть ли у меня какие-либо альтернативы здесь?
Я также предполагаю , что row
и page
сжатие не имеет эффекта , поскольку содержание NVARCHAR(MAX)
столбцов является уникальным.
VARCHAR
потере данных, если используются символы из более чем 1 кодовой страницы? Я думаю, что совет должен быть преобразован,NVARCHAR(4000)
если максимальная длина не превышает 4000, потому что тогда все значения будут иметь право на полное сжатие Unicode. Тем не менее, из информации в вопросе, вероятно, можно с уверенностью предположить, что значения имеют длину более 4000 символов, поэтому в настоящее время они не сжимаются.Ответы:
Сжатие страниц и строк не сжимает большие двоичные объекты .
Если вы хотите сжать большие двоичные объекты, вам нужно сохранить их как
VARBINARY(MAX)
и применить алгоритм сжатия потоков по вашему выбору. НапримерGZipStream
. Есть много примеров, как это сделать, просто найдите GZipStream и SQLCLR.источник
Есть (сейчас) потенциально два способа выполнить пользовательское сжатие:
Начиная с 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 ). Это означает:
Тем не менее, вы не должны использовать GZip и можете свободно реализовывать любой алгоритм, например.
ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: все методы, упомянутые выше, являются более «обходными», а не фактическими заменами, даже если они являются технически «альтернативными способами сжатия данных NVARCHAR (MAX)». Разница заключается в том, что с помощью встроенного сжатия данных -
row
иpage
- предлагаемый SQL Server, сжатие осуществляется за кадром , и данные еще можно использовать, читаемые, и индексируемые. Но сжатие любых данныхVARBINARY
означает, что вы экономите место, но отказываетесь от некоторых функций. Правда, строка 20 КБ в любом случае не индексируется, но все же ее можно использовать вWHERE
предложение, или с любыми строковыми функциями. Чтобы сделать что-либо с пользовательским сжатым значением, вам нужно будет распаковать его на лету. При сжатии бинарных файлов (PDF, JPEG и т. Д.) Это не проблема, но этот вопрос относится только кNVARCHAR
данным.источник