Індекси залишаються стисненими при їх перебудові / реорганізації.
Створити таблицю та стислий індекс
CREATE TABLE DBO.TEST_INDX(id int, bla varchar(255));
CREATE INDEX IX1 ON dbo.TEST_INDX(id) WITH (DATA_COMPRESSION = PAGE);
Перевірте стиснення
SELECT i.name, p.data_compression_desc
FROM sys.partitions P
INNER JOIN sys.indexes I ON I.object_id = P.object_id AND I.index_id = P.index_id
WHERE P.data_compression > 0 and I.name = 'IX1';
Результат
name data_compression_desc
IX1 PAGE
Перебудуйте індекс
ALTER INDEX IX1 on DBO.TEST_INDX rebuild
Перевірте стиснення
SELECT i.name, p.data_compression_desc
FROM sys.partitions P
INNER JOIN sys.indexes I ON I.object_id = P.object_id AND I.index_id = P.index_id
WHERE P.data_compression > 0 and I.name = 'IX1'
Результат
name data_compression_desc
IX1 PAGE
Якщо вимкнути їх і потім відновити, це має інший результат, оскільки відключення видаляє індекс, зберігаючи визначення індексу.
alter index IX1 on DBO.TEST_INDX DISABLE ;
alter index IX1 on DBO.TEST_INDX REBUILD ;
Результат
name data_compression_desc
Стиснення було втрачено, визначення стиснення також було б втрачено при падінні та створенні індексу через SSMS, не адаптуючи сценарій створення індексу.
Чому?
Оскільки параметр data_compression не зберігається при написанні оператора створення індексу.
однак, якщо ми відключили індекс, відновіть його за допомогою стиснення, а потім знову заново:
alter index IX1 on DBO.TEST_INDX DISABLE ;
alter index IX1 on DBO.TEST_INDX REBUILD WITH (DATA_COMPRESSION = PAGE);
alter index IX1 on DBO.TEST_INDX REBUILD;
Результат
name data_compression_desc
IX1 PAGE
Тестування відновлення за допомогою технічного обслуговування Ola hallengren
Параметри змінюються для тестування.
Додайте деякі дані, щоб потрапити на одну сторінку, як це потрібно для параметра MinNumberOfPages.
INSERT INTO dbo.TEST_INDX(id,bla)
VALUES(5,'test');
go 10
Виконати процедуру оптимізації індексу для друку оператора.
EXECUTE dbo.IndexOptimize
@Databases = 'TestDB',
@FragmentationLow = 'INDEX_REBUILD_ONLINE',
@FragmentationMedium = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30,
@Indexes = 'TestDB.DBO.TEST_INDX',
@Execute = 'N',
@MinNumberOfPages = 1;
Результат:
Command: ALTER INDEX [IX1] ON [TestDB].[dbo].[TEST_INDX] REBUILD WITH (SORT_IN_TEMPDB = OFF, ONLINE = ON, RESUMABLE = OFF)
Comment: ObjectType: Table, IndexType: NonClustered, ImageTex
t: No, NewLOB: No, FileStream: No, ColumnStore: No, AllowPageLocks: Yes, PageCount: 1, Fragmentation: 0
Outcome: Not Executed
Duration: 00:00:00
Date and time: 2019-01-09 14:48:12
Виконання створеної команди
ALTER INDEX [IX1] ON [TestDB].[dbo].[TEST_INDX] REBUILD WITH (SORT_IN_TEMPDB = OFF, ONLINE = ON, RESUMABLE = OFF)
Стиснення зберігається
name data_compression_desc
IX1 PAGE
Тестування відновлення з планом технічного обслуговування (я б твердо заперечував рішення Ola)
Перебудуйте індекси
Виберіть тестову таблицю
Додайте кілька рівнів тестової фрагментації.
Вставте деякі значення, щоб уникнути фрагментації
INSERT INTO dbo.TEST_INDX(id)
SELECT id from TEST_INDX
go 4
Перевірте відсоток фрагментації
SELECT
I.[name] AS INDX ,
IPS.avg_fragmentation_in_percent,
IPS.page_count
FROM sys.dm_db_index_physical_stats (DB_ID(), object_id('[dbo].[TEST_INDX]'), NULL, NULL, NULL) AS IPS
INNER JOIN sys.indexes AS I ON I.[object_id] = IPS.[object_id]
AND IPS.index_id = I.index_id
WHERE IPS.database_id = DB_ID()
and I.name = 'IX1'
Результат
INDX avg_fragmentation_in_percent page_count
IX1 66,6666666666667 3
Виконати план
Цікава частина тут, дивлячись на звіт про план, полягає в тому, що DATA_COMPRESSION = PAGE
опція додається до згенерованої REBUILD
команди!
Command:USE [TestDB]
GO
ALTER INDEX [IX1] ON [dbo].[TEST_INDX] REBUILD PARTITION = ALL WITH (PAD_INDEX = ON, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, RESUMABLE = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80, DATA_COMPRESSION = PAGE)
Фрагментація:
INDX avg_fragmentation_in_percent page_count
IX1 0 2
Стиснення:
name data_compression_desc
IX1 PAGE