Сжатие VARCHAR в SQL 2008/12 - результаты не видны - PullRequest
4 голосов
/ 20 марта 2012

Я экспериментировал со сжатием в SQL Server, но до сих пор не увидел ожидаемых результатов.

Для тестирования я создал новую таблицу с одним столбцом VARCHAR(8000) и вставил в нее 100 тыс. Строк.Каждая строка содержит около 500 слов текста, что при сжатии ZIP позволяет сэкономить более 90% пространства.

Я использую команду EXEC sp_estimate_data_compression_savings 'dbo', 'MyTable', NULL, NULL, 'PAGE' ;, чтобы проверить, сколько места будет сэкономлено при использовании сжатия PAGE, но этоговорит мне, что не будет много вообще.Результаты выглядят следующим образом:

object_name schema_name index_id    partition_number    size_with_current_compression_setting(KB)   size_with_requested_compression_setting(KB) sample_size_with_current_compression_setting(KB)    sample_size_with_requested_compression_setting(KB)
MyTable      dbo        0         1                       94048                                                  93440                               40064                                              39808

Что, по сути, вообще не экономит.Куда я иду не так?

пс.Я пытался провести тот же эксперимент со столбцом NVARCHAR(4000), и сжатие там показывает экономию, но я считаю, что это связано с тем, что сжатие заставляет использовать 1 символ вместо двух, когда данные не требуют 2 символов.На самом деле он не сжимает данные так, как это делает ZIP.

Ответы [ 2 ]

2 голосов
/ 20 марта 2012

Если данные выталкиваются вне строки (что, вероятно, произойдет в столбце VARCHAR(8000)), тогда вы не получите никакого сжатия. Сжимаются только данные в строке :

Из-за своего размера типы данных с большими значениями иногда хранятся отдельно от обычных данных строки на страницах специального назначения.Сжатие данных недоступно для данных, которые хранятся отдельно.

1 голос
/ 20 марта 2012

Сжатие страниц в SQL-сервере использует префиксные и словарные методы для сжатия данных. Он не может (и вам не хотелось бы) просматривать весь набор данных, чтобы определить наилучшее сжатие. Это может только смотреть на страницу данных за один раз. Наилучшие результаты достигаются, когда каждая последующая строка на странице отличается наименьшим количеством от предыдущих строк. Единственный способ сделать это - заставить SQL-сервер физически расположить строки на каждой странице так, чтобы они различались в наименьшей степени от строки к строке. Мы можем сделать это, создав кластеризованный индекс для поля или набора полей, которые гарантируют, что физическое расположение строк данных будет следовать за наименьшим изменением от строки к строке модели.

В приведенном вами примере набор слов в одном поле, подходящая степень сжатия может быть недостижимой. Это звучит как параграфы текста и будет сильно отличаться, независимо от их физического расположения.

Метод, который SQL-сервер использует для сжатия данных, позволяет ему извлекать содержимое любой строки без необходимости распаковывать всю страницу.

...