Чи залишаються стиснуті індекси SQL Server під час відновлення без зазначення стиснення даних?


13

Після відновлення своїх індексів SQL Server, використовуючи стиснення сторінки ( ALTER INDEX IX1 REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)), чи потрібно подальша перебудова (як це робиться у деяких скриптах технічного обслуговування, що минають певний поріг фрагментації) знову задавати стиснення даних? Чи вдалося б індекси ефективно декомпресувати?

Відповіді:


22

Індекси залишаються стисненими при їх перебудові / реорганізації.

Створити таблицю та стислий індекс

 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

Я натрапив на ваш пост, коли виявив, що 3 бази даних, які я стиснув, втратили стиснення, і мені довелося повторно застосувати його. У рамках цієї роботи я перевірив і підтвердив ваші результати, але не знаю, як це сталося. Єдиною іншою можливістю, на яку я зіткнувся, є те, що якщо індекси вимкнено, вони втрачають стиснення при перебудові. Це, мабуть, не так, для нашої команди ETL. Я також ставив це питання на SQLServerCentral: sqlservercentral.com/Forums/2017336/Databases-Lost-Compression Повністю в збиток, як це сталося.
Marvel

Привіт @Marvel, може бути, що якийсь інший процес відтворив індекси в базах даних? Наприклад, деякі програми роблять «оновлення», де вони опускаються та створюють незліченну кількість індексів. Однак я не думаю, що ніхто не зможе дати чітке пояснення без додаткових деталей. Наступного разу, коли це станеться, ви можете знайти дату створення індексу та знайти, чи вони там, де відтворено (наприклад, із запитом за цим посиланням: stackoverflow.com/questions/7579932/… . В іншому випадку ви завжди можете задати як запитання, але я подумайте, що вам потрібно буде надати більше інформації.
Ранді Вертонген

1
Дякую, Ранді! Я встановив SCHEMA_OBJECT_CHANGE_GROUP аудит на базах даних, але це, безумовно, допоможе мені швидше проаналізувати журнали. Я вже знайшов одного з винуватців - власника баз даних, того, хто вимагав стиснення, постійно змінював таблиці та індекси. Він не здогадувався, що коли він створює нові таблиці і переміщує старі дані в & створює нові індекси, це призведе до втрати стиснення. :( Я надав йому правильний спосіб створення своїх таблиць і покажчиків. Я не думаю, що він є єдиним винуватцем, однак я не можу уявити, що він зробив це до e
Marvel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.