2016-04-04 6 views
4

Я разработал приложение .NET WPF с хранилищем данных, обработанным SQL Server Compact Edition. Я заметил, что когда я заархивировал полученный файл SQL Server CE, я часто сжимаю его до 5% от исходного размера файла.C# SQL Server Compact Edition: очень высокий коэффициент сжатия

Рискуя показать некоторое значительное незнание здесь, это ожидаемое поведение? Кажется, что, учитывая эту огромную экономию размеров, я должен сжимать файлы каждый раз при сохранении (я еще не рассмотрел последствия этой проблемы). Размер базы данных может варьироваться от нескольких МБ до 4 ГБ, хотя это будет редко. Сохраняются ли мои данные неэффективно или почему я получаю такую ​​значительную экономию, когда сжимаю? Есть ли что-то, что я могу сделать, чтобы всегда сохранять это пространство без необходимости внешнего сжатия файла SQL Server CE?

+0

Это тип вопроса для начинающих, которого я ожидал бы. Нет никакого невежества, чтобы стыдиться. Это не вопрос «Я не хочу искать синтаксис в документации». Ответ очевиден - но не для новичков, только для тех, кто знает внутреннюю работу базы данных. Поэтому не стесняйтесь, на самом деле это хороший вопрос. – TomTom

ответ

2

База данных не должна быть сжата, так как она сильно повлияет на производительность поиска. Я приведу вам пример.

Если поле длиной 200 байт, база данных зарезервировала 200 байт, чтобы сохранить значение в определенной строке. Он может рассчитать общий размер строки, добавляя длину всех полей.

Алгоритм сжатия может сжать фактическое значение в нем почти до нуля. Однако, если база данных будет делать это, она не может рассчитывать на вычисление позиции на диске (номер строки * размер строки + смещение столбца). Сначала нужно распаковать все, чтобы получить значение определенного столбца в определенной строке. Вы не хотите этого для точки зрения производительности.

+1

Наверху базы данных часто имеют много пустого пространства. Предварительное выделение некоторого резерва для вставок и т. Д. Индексы, например, не заполнены, поэтому вставка не всегда вызывает разбиение страницы (и они организованы на страницах и распределяют их). – TomTom

+0

Спасибо за это. Не могли бы вы порекомендовать какое-то чтение по этому поводу? Мое понимание механики SQL весьма ограничено. –