Вступление
Производительность MS SQL Server зависит от эффективности дискового ввода-вывода. Если данные находятся на сервере MS SQL, сжатие повышает производительность, так как требуется меньше страниц.
Microsoft SQL Server 2008 Enterprise Edition поддерживает механизм сжатия данных, который мы обсудим в этой статье.
Где мы можем настроить это
Сжатие данных может быть настроено для таблицы, кластеризованного индекса, некластеризованного индекса, индексных представлений и разделов таблицы или для индекса.
Уровни сжатия данных
Сжатие данных может быть реализовано на двух уровнях
1.
Ряд
2.
Страница
Сжатие данных на уровне строк
Основная цель заключается в том, чтобы в одну страницу данных могло поместиться больше строк.
1.
Снижаются накладные расходы на метаданные записей.
2. Сжатие данных на уровне строк превращает типы данных фиксированной длины в типы данных переменной длины, освобождая пустое пространство.
Давайте рассмотрим пример, чтобы понять суть № 2
Предположим, что 120 хранятся в типе данных INTEGER. Все мы знаем, что тип данных INTEGER для хранения занимает 4 байта, поэтому для значения 120 также требуется 4 байта.
Мы также знаем, что значение INTEGER от 0 до 255 может храниться в 1 байте. Таким образом, после сжатия освобождается 3 байта, и наше значение 120 занимает 1 байт для хранения.
3.
Он также имеет возможность игнорировать нулевые и нулевые значения, экономя дополнительное пространство.
Сжатие данных на уровне страницы
Это начинается со сжатия данных на уровне строк. С его помощью требуется две дополнительные функции сжатия — префикс и словарь сжатия.
Префиксное сжатие
В этом методе находит дубликаты префиксов на странице для каждого столбца и заменяет каждый дубликат небольшим ссылочным номером.
Сжатие словаря. В этом методе находит повторяющиеся значения на странице, собирает их в словарь, сохраненный после заголовка страницы, но перед строками данных, и заменяет повторяющиеся значения соответствующими смещениями в словаре.
Пример сжатия данных в MS SQL Server
Step – 1 [ Create The Base Table ] IF OBJECT_ID(N'dbo.tbl_EMPLOYEE', N'U') IS NOT NULL BEGIN DROP TABLE [dbo].[tbl_EMPLOYEE]; END GO CREATE TABLE [dbo].[tbl_EMPLOYEE] ( EMPID INT, EMPNAME VARCHAR(50) ) GO Step – 2 [ Insert Some Records ] INSERT INTO [dbo].[tbl_EMPLOYEE] (EMPID, EMPNAME) VALUES(1, 'Joydeep Das'); GO 5000 Step - 3 [ Check the Space used by Original Table ] EXEC sp_spaceused tbl_EMPLOYEE
имя |
Ряды |
Зарезервированный |
Данные |
Index_size |
неиспользуемый |
tbl_EMPLOYEE
|
5000 |
200KB |
152KB |
8KB |
40KB |
Step – 4 [ Now we Used Data Compression ROW ] ALTER TABLE [dbo].[tbl_EMPLOYEE] REBUILD WITH (DATA_COMPRESSION = ROW); GO Step – 5 [ Now Again Check the Space Used After Data Compression ROW ] EXEC sp_spaceused tbl_EMPLOYEE
имя |
Ряды |
Зарезервированный |
Данные |
Index_size |
неиспользуемый |
tbl_EMPLOYEE
|
5000 |
144Kb |
120KB |
8KB |
16KB |
Step – 6 [ Now we Used Data Compression PAGE ] ALTER TABLE [dbo].[tbl_EMPLOYEE] REBUILD WITH (DATA_COMPRESSION = PAGE); GO Step – 7 [ Now Again Check the Space Used After Data Compression PAGE ] EXEC sp_spaceused tbl_EMPLOYEE
имя |
Ряды |
Зарезервированный |
Данные |
Index_size |
неиспользуемый |
tbl_EMPLOYEE
|
5000 |
80KB |
64KB |
8KB |
8KB |
Step – 8 [ Now We Comare all Again ]
Оригинал
без сжатия
без сжатия
имя |
Ряды |
Зарезервированный |
Данные |
Index_size |
неиспользуемый |
tbl_EMPLOYEE
|
5000 |
200KB |
152KB |
8KB |
40KB |
Сжатие ROW
имя |
Ряды |
Зарезервированный |
Данные |
Index_size |
неиспользуемый |
tbl_EMPLOYEE
|
5000 |
144Kb |
120KB |
8KB |
16KB |
Сжатие PAGE
имя |
Ряды |
Зарезервированный |
Данные |
Index_size |
неиспользуемый |
tbl_EMPLOYEE
|
5000 |
80KB |
64KB |
8KB |
8KB |
Тип сжатия
|
Данные
|
НЕТ сжатия (оригинал)
|
152KB |
Сжатие ROW
|
120KB |
Сжатие PAGE
|
64KB |