Доступно с лицензией Workflow Manager.
Использование сжатия данных
Сжатие строк и страниц для таблиц и индексов позволяет вам сохранить место на диске для хранения данных за счет уменьшения размера базы данных. Сжатие данных имеет недостаток – увеличение загрузки процессора, поскольку при осуществлении доступа данные должны быть сжаты и распакованы. Вы не можете использовать сжатие данных для системных таблиц и только версии SQL Server Enterprise и Developer поддерживают сжатие данных.
Вы можете настроить сжатие данных на следующем:
- Кластеризованные таблицы
- Накапливающие таблицы (накапливающими являются таблицы без кластеризованного индекса)
- Некластеризованные индексы
- Индексированные представления
- Индивидуальные разделы разделенной таблицы или индекса
Существуют три формы сжатия данных, которые вы можете использовать в SQL Server: сжатие на уровне строк, сжатие в юникоде и сжатие на уровне страниц.
Более подробно см. в Накапливающие таблицы (Таблицы без кластеризованного индекса) в библиотеке MSDN.
Сжатие на уровне строк
Сжатие на уровне строк работает с использованием более эффективных форматов хранения данных фиксированной длины. Сжатие на уровне строк использует для экономии пространства следующие стратегии:
- Хранение типов числовых данных фиксированной длины и типов данных CHAR таким образом, как будто бы они являются типами данных переменной длины
- Не сохранение значений NULL или 0
- Сокращение метаданных, требуемых для хранения данных
Хотя это действительно уменьшает объем используемого данными пространства, сжатие на уровне строк не обеспечивает улучшения хранения, присущего сжатию на уровне страниц. Преимущество сжатия на уровне строк состоит в том, что оно требует меньшей загрузки процессора, чем сжатие на уровне страниц. Вы можете использовать следующий синтаксис для сжатия таблицы методом сжатия на уровне строк:
ALTER TABLE tableName REBUILD WITH (DATA_COMPRESSION=ROW)
Например, чтобы перестроить все разделы таблицы wmx.TableA базы данных WMXDB методом сжатия строк, используйте следующий запрос:
USE [WMXDB]
ALTER TABLE [wmx].[TableA] REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = ROW)
Используйте следующий синтаксис для настройки индекса на сжатие на уровне строк:
ALTER INDEX indexName ON tableName REBUILD PARTITION ALL WITH (DATA_COMPRESSION=ROW)
Более подробно о сжатии данных на уровне строк см. в Выполнение сжатия строк в библиотеке MSDN.
Сжатие в юникод
Сжатие Юникод позволяет процессору базы данных сжимать юникод-значения в объектах, сжатых на уровне страниц или строк. Вы можете использовать сжатие в юникоде для типов данных фиксированной длины nchar(n) и nvarchar(n). Сжатие в юникоде в случае необходимости используется автоматически при включении сжатия строк и страниц.
Более подробно о сжатии в юникоде см. в Выполнение сжатия строк в юникоде в библиотеке MSDN.
Сжатие на уровне страниц
Сжатие на уровне страниц сжимает данные, сохраняя повторяющиеся значения и общие префиксы только один раз, затем делает ссылки на эти значения из других мест таблицы. Когда сжатие страниц применяется к таблице, метод сжатия строк применяется также. Сжатие на уровне страниц использует следующие стратегии:
- Сжатие на уровне строк применяется для максимизации количества строк, хранящихся на странице.
- Сжатия префикса столбца применяется путем замены повторяющихся в данных образцов ссылками.
- Эти данные хранятся в заголовке страницы.
- Сжатие словаря сканирует в поиске повторяющихся значений и сохраняет эту информацию в заголовке страницы.
Преимущества сжатия страниц зависит от типа сжимаемых данных. Данные, которые включают в себя множество повторяющихся значений, будут сжаты больше, чем данные, содержащие большее количество уникальных значений. Используйте следующий общий синтаксис для применения сжатия на уровне страниц:
ALTER TABLE name REBUILD WITH (DATA_COMPRESSION=PAGE)
Например, чтобы перестроить все разделы таблицы wmx.TableA базы данных WMXDB методом сжатия страниц, используйте следующий запрос:
USE [WMXDB]
ALTER TABLE [wmx].[TableA] REBUILD PARTITION = ALL
WITH
(DATA_COMPRESSION = PAGE)
Используйте следующий синтаксис для настройки индекса на сжатие на уровне страниц:
ALTER INDEX indexName ON tableName REBUILD PARTITION ALL WITH (DATA_COMPRESSION=PAGE)
Более подробно о сжатии данных на уровне страниц см. в Выполнение сжатия страниц в библиотеке MSDN.
Если таблицы или индексы разбиваются, вы можете настроить сжатие для каждого раздела. Если вы разбиваете раздел с помощью оператора ALTER PARTITION, новые разделы наследуют атрибут сжатия данных исходного раздела. Если вы объединяете два раздела, результирующий раздел имеет атрибут сжатия целевого раздела. Хотя сжатие позволяет сохранить больше строк на странице, оно не изменяет максимальный размер строки таблицы или индекса. К таблице нельзя применить сжатие, если максимальный размер строки и её размер в сжатом виде превышают 8060 байт. Настройка сжатия по умолчанию для индексов – NONE и вы должны указать свойство сжатия для индексов при их создании. Некластеризованные индексы не наследуют свойство сжатия таблицы, но кластерные индексы, созданные на базе накапливающих, наследуют статус сжатия накапливающего индекса. Сжатие данных применяется только для источника, поэтому когда вы экспортируете данные из сжатого источника, SQL Server будет выводить данные в несжатом формате строки. Импорт данных без сжатия в целевую таблицу, включенный на сжатие, будет сжимать данные.
Более подробно о сжатии данных см. в Сжатие данных в библиотеке MSDN.
Вы можете настроить сжатие, используя предыдущий оператор Transact-SQL или из SQL Server Management Studio с помощью Мастера сжатия данных либо для таблиц, либо для индексов. Вы можете использовать Мастер сжатия данных для добавления и удаления сжатия. Чтобы изменить настройки сжатия для таблиц и индексов с помощью Мастера сжатия данных, выполните следующие действия:
- В SQL Server Management Studio щелкните правой кнопкой мыши таблицу или индекс, которые вы хотите сжать, выберите Хранилище и затем Управление сжатием.
- На странице Добро пожаловать в Мастер сжатия данных нажмите Далее.
- На странице Выбрать тип сжатия можно выбрать один тип сжатия для всех разделов или выбрать отдельно для каждого раздела опцию сжатия Строка, Страница или Без сжатия. Щелкните Вычислить, чтобы определить разницу между текущим используемым пространством и пространством, которое должно быть занято после сжатия.
- На странице Выбрать выходную опцию выберите создание скрипта, немедленное выполнение операции или выполнение по установленному графику. Щелкните Далее, затем Готово, чтобы закрыть мастер.
Более подробно о Мастере сжатия данных см. в Справка по Мастеру сжатия данных в библиотеке MSDN.
Оценка сжатия
Лучшим способом определить преимущества сжатия для объекта является использование процедуры сохранения sp_estimate_data_compression_savings. Эффективность сжатия зависит от такого фактора, как уникальность данных. Процедура сохранения sp_estimate_data_compression_savings доступна для SQL Server только в версии Enterprise.
Синтаксис процедуры сохранения выглядит так:
sp_estimate_data_compression_savings[ @schema_name = ] 'schema_name', [ @object_name = ]
'object_name', [@index_id = ] index_id,[@partition_number = ] partition_number,
[@data_compression = ] 'data_compression'
Например, для настройки оценки эффективности сжатия с использованием сжатия строк для таблицы wmx.TableA базы данных WMXDB, выполните следующую инструкцию Transact-SQL:
USE WMXDB;
GO
EXEC sp_estimate_data_compression_savings 'wmx', 'TableA', NULL, NULL,
'ROW';
GO
Для настройки оценки эффективности сжатия с использованием сжатия страниц для той же таблицы, выполните следующую инструкцию Transact-SQL:
USE WMXDB;
GO
EXEC sp_estimate_data_compression_savings 'wmx', 'TableA', NULL, NULL,
'PAGE';
GO
Для получения дополнительной информации о том, как оценить экономию сжатия, см. Estimate Data Compression Savings (Transact-SQL) в библиотеке MSDN.
Вы можете использовать приведённый ниже скрипт SQL для пользовательских таблиц и индексов wmx и для генерации инструкций SQL для настройки сжатия страниц для таблиц и индексов.
/*---------------------------------------------------------------------
-- Verify WMX Schema Storage
---------------------------------------------------------------------*/
USE [wmxdb]
GO
/*---------------------------------------------------------------------
--List all tables
---------------------------------------------------------------------*/
SELECT USER_NAME(o.uid) [owner], o.name,o.id,o.type,o.status
FROM sysobjects o
WHERE USER_NAME(o.uid) = 'wmx'
AND o.type <> 'S' and o.type = 'U'
ORDER BY o.name,o.type;
GO
/*---------------------------------------------------------------------
--List all indexes
---------------------------------------------------------------------*/
SELECT USER_NAME(o.uid) [owner], OBJECT_NAME(i.id) [table], i.name [index],o.type [type]
FROM sysindexes i inner join sysobjects o ON i.id = o.id
WHERE USER_NAME(o.uid) = 'wmx'
AND o.type <> 'S' and o.type = 'U' and i.indid = 1
ORDER BY USER_NAME(o.uid),OBJECT_NAME(i.id),i.name;
GO
/*---------------------------------------------------------------------
--Table page compression
--Example:
/*
ALTER TABLE WMX.JTX_JOBS_AOI
REBUILD WITH (DATA_COMPRESSION = PAGE);
GO
*/
---------------------------------------------------------------------*/
--Generate script to set table page compression:
SELECT 'ALTER TABLE ' + USER_NAME(o.uid) + '.' + o.name + ' REBUILD WITH (DATA_COMPRESSION = PAGE);' [TXTSQL]
FROM sysobjects o
WHERE USER_NAME(o.uid) = 'wmx'
AND o.type <> 'S' and o.type = 'U'
ORDER BY o.name,o.type;
GO
/*---------------------------------------------------------------------
--Index page compression
--Example:
/*
ALTER INDEX R125_pk
ON WMX.JTX_JOBS_AOI
REBUILD WITH ( DATA_COMPRESSION = PAGE ) ;
GO
*/
---------------------------------------------------------------------*/
--Generate script to set index page compression: SELECT 'ALTER INDEX ' + i.name + ' ON ' + USER_NAME(o.uid) + '.'
+ OBJECT_NAME(i.id) + ' REBUILD WITH ( DATA_COMPRESSION = PAGE );' [TXTSQL] FROM sysindexes i inner join sysobjects o ON
i.id = o.id WHERE USER_NAME(o.uid) = 'wmx'
AND i.name NOT LIKE '_WA%'
--AND o.type <> 'S' and o.type = 'U' and i.indid = 1
ORDER BY USER_NAME(o.uid),OBJECT_NAME(i.id),i.name; GO
Сжатие и TDE
Шифрование файла базы данных выполняется на уровне страницы. Страницы в зашифрованной базе данных шифруются перед тем, как они записываются на диск, и расшифровываются при считывании в память. TDE не увеличивает размер зашифрованной базы данных.
Более подробно см. в SQL Server – Прозрачное шифрование данных (TDE) в библиотеке MSDN.
Зашифрованные данные сжимаются в значительно меньшей степени, чем незашифрованные. Если TDE используется для шифрования базы данных, сжатие резервных копий не сможет значительно уменьшить объем резервного хранилища.
Более подробно см. в SQL Server – Сжатие данных в библиотеке MSDN.