Сжатие данных

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

SQL Server, База данных SQL Azure и Управляемый экземпляр SQL Azure поддерживать сжатие строк и страниц для таблиц и индексов rowstore, а также поддержку архивации columnstore и архивации columnstore для таблиц и индексов columnstore.

Для таблиц и индексов rowstore используйте функцию сжатия данных, чтобы уменьшить размер базы данных. Помимо экономии места, сжатие данных позволяет повысить производительность при рабочих нагрузках с интенсивным вводом-выводом, поскольку данные хранятся в меньшем количестве страниц и в запросах требуется считывать меньше страниц с диска. Однако для сжатия и распаковки данных при обмене данными с приложениями требуются дополнительные ресурсы ЦП на сервере баз данных. Можно настроить сжатие строк и страниц для следующих объектов баз данных:

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

Для таблиц и индексов columnstore все таблицы и индексы columnstore всегда используют сжатие columnstore, и это не настраивается пользователем. Используйте архивное сжатие columnstore, чтобы еще больше сократить размер данных в случаях, когда можно предоставить дополнительное время и ресурсы ЦП для хранения и извлечения данных. Можно настроить архивное сжатие columnstore для следующих объектов базы данных:

  • Вся таблица columnstore или весь кластеризованный индекс columnstore. Таблица columnstore хранится в виде кластеризованного индекса columnstore, поэтому оба подхода приносят одинаковые результаты.
  • Весь некластеризованный индекс columnstore.
  • Для секционированных таблиц columnstore и индексов columnstore можно настроить параметр сжатия архива для каждой секции, а различные секции не должны иметь одинаковый параметр сжатия архива.

Примечание.

Данные могут быть сжаты с использованием формата алгоритма GZIP. Этот дополнительный шаг лучше всего подходит для сжатия фрагментов данных при архивации старых данных для долговременного хранения. Данные, сжатые с помощью COMPRESS функции, не могут быть индексированы. Дополнительные сведения см. в разделе COMPRESS (Transact-SQL).

Рекомендации по сжатию строк и страниц

При использовании сжатия строк и страниц следует учитывать следующее.

  • Подробности сжатия данных могут меняться без предварительного уведомления в пакетах обновлений или в последующих версиях.

  • Сжатие доступно в База данных SQL Azure

  • Сжатие недоступно в каждом выпуске SQL Server. Дополнительные сведения см. в списке выпусков и поддерживаемых функций в конце этого раздела.

  • Сжатие недоступно для системных таблиц.

  • Сжатие может позволить хранить больше строк на странице, но не изменяет максимальный размер строки таблицы или индекса.

  • Таблица не может быть включена для сжатия, если максимальный размер строки плюс нагрузка на сжатие превышает максимальный размер строки размером 8 060 байт. Например, таблица со столбцами c1 CHAR(8000) и c2 CHAR(53) не может быть сжата из-за дополнительных затрат на сжатие. Если используется формат хранилища vardecimal, проверка размера строки выполняется при включении формата. При использовании сжатия строк и страниц проверка размера строки выполняется при первичном сжатии объекта, а также при всех последующих вставках и изменениях строк. При использовании сжатия обеспечивается выполнение следующих двух правил.

    • Обновление для типа с фиксированной длиной должно всегда завершаться успешно.
    • Отключение сжатия данных должно всегда выполняться успешно. Даже если сжатые строки помещаются на страницу, это означает, что это меньше 8060 байт; SQL Server предотвращает обновления, которые не помещаются в строку при распаковках.
  • Данные вне строки не сжимаются при включении сжатия данных. Например, XML-запись, размер которой превышает 8 060 байт, использует внестровые страницы, которые не сжимаются.

  • Несколько типов данных не влияют на сжатие данных. Дополнительные сведения см. в статье Влияние сжатия строк на хранение.

  • При указании списка секций тип сжатия можно задать ROWPAGEдля отдельных секций или NONE для отдельных секций. Если список секций не указан, все секции задаются свойством сжатия данных, указанным в инструкции. При создании индекса или таблицы для свойства сжатия устанавливается значение NONE, если не было указано другое значение. При изменении таблицы сохраняется существующее сжатие, если не было указано иное.

  • При указании списка секций или секции, выходящей за пределы диапазона, выдается ошибка.

  • Некластеризованные индексы не наследуют свойство сжатия таблицы. Чтобы сжать индексы, необходимо явно задать для них свойство сжатия. По умолчанию при создании индексов для них устанавливается режим сжатия NONE.

  • При создании кластеризованного индекса в куче кластеризованный индекс наследует состояние сжатия кучи, если не указано другое состояние сжатия.

  • Если для кучи было настроено сжатие уровня страницы, для страниц такое сжатие будет реализовываться только следующими методами.

    • Массовый импорт данных осуществляется со включенными массовыми оптимизациями.
    • Данные вставляются с помощью INSERT INTO ... WITH (TABLOCK) синтаксиса, а таблица не имеет некластеризованного индекса.
    • Таблица перестроена путем выполнения ALTER TABLE ... REBUILD инструкции с параметром PAGE сжатия.
  • Новые страницы, выделенные в куче в рамках операций DML, не используют PAGE сжатие, пока куча не будет перестроена. Перестройте кучу. Для этого удалите и повторно примените сжатие либо создайте и удалите кластеризованный индекс.

  • Чтобы изменить параметры сжатия кучи, необходимо перестроить все некластеризованные индексы в таблице. Это обеспечивает наличие в них указателей на новые расположения в куче.

  • Вы можете включить или отключить или отключить или PAGE отключить ROW сжатие в сети или в автономном режиме. Включение сжатия для кучи является однопоточным для операции в сети.

  • Чтобы включить или отключить сжатие строки или страницы, необходимо столько же места на диске, как и для создания или перестройки индекса. Для секционированных данных объем пространства, необходимый для включения или отключения сжатия, можно сократить, выполняя включение или отключение сжатия последовательно для каждой секции.

  • Чтобы определить состояние сжатия секций в секционированных таблицах, выполните запрос data_compression к столбцу sys.partitions представления каталога.

  • При сжатии индексов страницы конечного уровня можно сжать как с помощью сжатия строк, так и страниц. Неконечные страницы не получают сжатие страниц.

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

  • Таблицы, реализующие формат хранилища vardecimal в SQL Server 2005 (9.x), сохраняют этот параметр при обновлении. Сжатие строк можно применить к таблице с форматом хранилища vardecimal . Тем не менее, поскольку сжатие строк является супермножеством формата хранилища vardecimal, нет причин сохранить формат хранилища vardecimal. Десятичные значения не получают дополнительного сжатия при объединении формата хранилища vardecimal с сжатием строк. Сжатие страниц можно применить к таблице с форматом хранения vardecimal. Однако столбцы формата хранилища vardecimal, вероятно, не достигают дополнительного сжатия.

    Примечание.

    Все поддерживаемые версии SQL Server поддерживают формат хранилища vardecimal. Однако, поскольку сжатие данных достигает одинаковых целей, формат хранилища vardecimal не рекомендуется. Эта функция будет удалена в будущей версии SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.

Список функций, поддерживаемых выпусками SQL Server в Windows, см. в следующих статье:

Columnstore и архивное сжатие Columnstore

Таблицы и индексы Columnstore всегда сохраняются со сжатием columnstore. Можно еще более уменьшить размер данных columnstore, настроив дополнительное сжатие, именуемое архивным сжатием. Для выполнения архивации SQL Server запускает алгоритм сжатия Microsoft XPRESS для данных. Добавьте или удалите архивное сжатие, используя следующие типы сжатия данных.

  • Используйте сжатие данных COLUMNSTORE_ARCHIVE для сжатия данных columnstore с помощью архивного сжатия.
  • Используйте COLUMNSTORE сжатие данных для распаковки архивного сжатия. Эти результирующие данные по-прежнему будут сжаты с использованием сжатия columnstore.

Чтобы добавить сжатие архивов, используйте ALTER TABLE (Transact-SQL) или ALTER INDEX (Transact-SQL) с параметром REBUILD и DATA COMPRESSION = COLUMNSTORE_ARCHIVE.

Например:

ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = 1 WITH (
    DATA_COMPRESSION = COLUMNSTORE_ARCHIVE
);

ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = ALL WITH (
    DATA_COMPRESSION = COLUMNSTORE_ARCHIVE
);

ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = ALL WITH (
    DATA_COMPRESSION = COLUMNSTORE_ARCHIVE ON PARTITIONS (2, 4)
);

Чтобы удалить архивное сжатие и восстановить данные в сжатие columnstore, используйте ALTER TABLE (Transact-SQL) или ALTER INDEX (Transact-SQL) с параметром REBUILD иDATA COMPRESSION = COLUMNSTORE.

Например:

ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = 1 WITH (
     DATA_COMPRESSION = COLUMNSTORE
);

ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = ALL WITH (
    DATA_COMPRESSION = COLUMNSTORE
);

ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = ALL WITH (
    DATA_COMPRESSION = COLUMNSTORE ON PARTITIONS (2, 4)
);

В следующем примере устанавливается сжатие данных columnstore в некоторых секциях и архивное сжатие columnstore в других секциях.

ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = ALL WITH (
    DATA_COMPRESSION = COLUMNSTORE
        ON PARTITIONS (4, 5),
    DATA COMPRESSION = COLUMNSTORE_ARCHIVE
        ON PARTITIONS (1, 2, 3)
);

Производительность

При сжатие индексов columnstore с помощью архивации это приводит к тому, что индекс выполняется медленнее, чем индексы columnstore, которые не имеют архивного сжатия. Используйте архивное сжатие только при наличии дополнительного времени и ресурсов ЦП для сжатия и получения данных.

Преимущество архивного сжатия уменьшается, что полезно для данных, к которым часто не обращаются. Например, если имеется секция для данных за каждый месяц и основная часть активности пришлась на последние месяцы, то можно архивировать предыдущие месяцы, чтобы уменьшить требования к хранилищу.

Метаданные

Следующие системные представления содержат сведения о сжатии данных для кластеризованных индексов.

Процедура sp_estimate_data_compression_savings (Transact-SQL) также может применяться к индексам columnstore.

Влияние на секционированные таблицы и индексы

При использовании сжатия данных в секционированных таблицах или индексах следует учитывать следующее.

  • При разбиении секций с помощью инструкции ALTER PARTITION обе секции наследуют атрибут сжатия данных исходной секции.

  • При слиянии двух секций результирующая секция унаследует атрибут сжатия данных секции назначения.

  • Для переключения секции свойство сжатия данных секции должно совпадать со свойством сжатия таблицы.

  • Существуют две вариации синтаксиса, которые можно использовать для изменения сжатия секционированной таблицы или индекса.

    • Следующий синтаксис перестраивает только упоминаемую секцию:

      ALTER TABLE <table_name>
      REBUILD PARTITION = 1 WITH (
          DATA_COMPRESSION = <option>
      );
      
    • Следующий синтаксис перестраивает всю таблицу с помощью существующего параметра сжатия для любых секций, на которые не ссылаются:

      ALTER TABLE <table_name>
      REBUILD PARTITION = ALL WITH (
          DATA_COMPRESSION = PAGE ON PARTITIONS(<range>),
          ...
      );
      

    Для секционированных индексов действуют те же принципы, но используется инструкция ALTER INDEX.

  • При удалении кластеризованного индекса соответствующие секции кучи сохраняют настройки сжатия данных, если только не была изменена схема секционирования. Если схема секционирования подверглась изменениям, все секции перестраиваются в распакованное состояние. Чтобы удалить кластеризованный индекс и изменить схему секционирования, необходимо выполнить следующие шаги.

    1. Удалить кластеризованный индекс.
    2. Изменить таблицу с помощью параметра ALTER TABLE ... REBUILD, в котором указывается режим сжатия.

    Чтобы удалить кластеризованный индекс OFFLINE , это быстрая операция, так как удаляются только верхние уровни кластеризованных индексов. При удалении ONLINEкластеризованного индекса SQL Server должен перестроить кучу два раза, один раз для шага 1 и один раз для шага 2.

Влияние сжатия на репликацию

При использовании сжатия данных с реплика tion следует учитывать следующие рекомендации.

  • Если агент моментальных снимков формирует первичный скрипт схемы, в новой схеме для таблицы и ее индексов будет использован один и тот же режим сжатия. Сжатие нельзя включить только в таблице, а не индексе.

  • Для реплика транзакций параметр схемы статьи определяет, какие зависимые объекты и свойства должны быть скриптированы. Дополнительные сведения см. в разделе sp_addarticle.

    Агент распространения не проверка для подписчиков нижнего уровня при применении скриптов. При выборе репликации сжатия создание таблицы у подписчиков низкого уровня завершится неудачно. Для смешанной топологии не включите реплика сжатие.

  • Для репликации слиянием уровень совместимости публикаций переопределяет параметры схемы и определяет, какие из объектов схемы будут внесены в скрипт.

    Для смешанной топологии, если для поддержки новых параметров сжатия не требуется, уровень совместимости публикации должен быть установлен на версию подписчика нижнего уровня. Если это необходимо, сжать таблицы на подписчике после их создания.

В следующей таблице показываются настройки репликации, управляющие сжатием в процессе репликации.

Намерение пользователя Выполнить репликацию схемы секционирования для таблицы или индекса Выполнить репликацию настроек сжатия Действия со сценариями
Выполнить репликацию схемы секционирования и включить сжатие на подписчике для этой секции. Истина Истина Создать скрипты для схемы секционирования и для настроек сжатия.
Выполнить репликацию схемы секционирования, но не сжимать данные на подписчике. Истина False Создать скрипт для схемы секционирования, но не создавать его для настроек сжатия секции.
Не реплика выполнять схему секционирования и не сжимать данные на подписчике. False False Не выполняет сценарии секций или параметров сжатия.
Выполнить сжатие таблицы на подписчике при условии, что на издателе были сжаты все секции, но не выполнять репликацию схемы секционирования. False Истина Проверить, что для всех секций включено сжатие.

Создать скрипт сжатия на уровне таблицы.

Влияние на другие компоненты SQL Server

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Сжатие происходит в ядро СУБД, и данные представлены большинству других компонентов SQL Server в несжатом состоянии. Это ограничивает влияние сжатия на другие компоненты следующими факторами:

  • Операции массового импорта и экспорта
    • При экспорте данных, даже в собственном формате, данные выводятся в распакованном формате строк. Поэтому размер экспортированного файла данных может значительно превысить размер исходных данных.
    • При импорте данных, если целевая таблица включена для сжатия, ядро СУБД преобразует данные в сжатый формат строки. По сравнению с импортом данных в распакованную таблицу такой импорт может потребовать больше ресурсов ЦП.
    • Если массовый импорт данных производится в кучу с включенным сжатием страниц, то при вставке данных операция массового импорта попытается применить к ним сжатие страниц.
  • Сжатие не влияет на резервное копирование и восстановление.
  • Сжатие не влияет на доставку журналов.
  • Сжатие данных несовместимо с разреженными столбцами. Таким образом, таблицы, содержащие разреженные столбцы, не могут быть сжаты и не могут добавляться в сжатые столбцы.
  • Включение сжатия может вызвать изменение планов запросов, поскольку данные будут занимать при хранении другое число страниц с другим числом строк на страницу.