.NET сжатие XML для хранения в базе данных SQL Server
=====================================================

В настоящее время наше приложение .NET создает данные XML в памяти, которые мы сохраняем в базе данных SQL Server. Объект XElement преобразуется в строку с помощью ToString () и затем сохраняется в столбце varchar (MAX) в БД. Мы не хотим использовать тип данных SQL XML, поскольку нам не требуется проверка, а SQL не нужно запрашивать XML на любом этапе.

Хотя эта реализация работает нормально, мы хотим уменьшить размер базы данных, сжимая XML перед его сохранением и распаковывая его после извлечения. Есть ли у кого-нибудь пример кода для сжатия объекта XElement (и распаковка тоже будет здорово)? Кроме того, какие изменения мне нужно внести в тип данных столбца базы данных, чтобы мы могли в полной мере воспользоваться этим сжатием?

Я снова исследовал тип данных XML, предлагаемый SQL Server 2005, и издержки проверки, которые он предлагает, слишком высоки, чтобы мы могли рассмотреть его использование. Кроме того, хотя он несколько сжимает XML, он не так сильно сжимает, как класс .NET DeflateStream.

Я протестировал класс DeflateStream, записав XML-файл, который мы используем, на диск, а затем сохранил собранную версию в виде нового файла. В результате получаются отличные результаты: файл размером 16 КБ сводится к файлу размером 3 КБ, так что это лишь случай, когда это работает в памяти и сохраняется результирующие данные в БД. У кого-нибудь есть какой-нибудь пример кода для сжатия, и я должен изменить столбец varcahr (MAX) на тип, возможно, на varbinary?

заранее спасибо

Я думаю, что вы также должны повторно протестировать столбец XML. Он хранится в двоичном формате, я знаю, а не в виде текста. Он может быть меньше и может не работать плохо, даже если вам на самом деле не нужны дополнительные функции.



Помимо возможного сжатия самой строки (возможно, с использованием метода BaseB LBushkin выше), вы, вероятно, захотите начать с того, чтобы убедиться, что вы удалили все пробелы. Метод XElement.ToString () по умолчанию сохраняет элемент с «отступом». Вам нужно использовать метод ToString (параметры SaveOptions) (используя SaveOptions.DisableFormatting), если вы хотите убедиться, что вы только что получили теги и данные.



[Эта статья](http://www.csharphelp.com/archives4/archive689.html) может помочь вам начать.

Следующий фрагмент может сжать строку и вернуть кодированный результат base-64:

РЕДАКТИРОВАТЬ: Кроме того, вы можете использовать форматы CLOB даже при хранении XML в виде текста, потому что varchars имеют очень ограниченную длину - который часто может превышать XML.



Я знаю, что вы пометили вопрос SQL 2005, но вы должны рассмотреть возможность обновления до SQL 2008 и использования замечательного нового[возможности сжатия](https://msdn.microsoft.com/en-us/library/dd894051.aspx) которые идут с этим. Готов к работе, прозрачен для вашего приложения и сэкономит вам огромные затраты на внедрение / тестирование / поддержку.