Los índices permanecen comprimidos al reconstruirlos / reorganizarlos.
Crear tabla e índice comprimido
CREATE TABLE DBO.TEST_INDX(id int, bla varchar(255));
CREATE INDEX IX1 ON dbo.TEST_INDX(id) WITH (DATA_COMPRESSION = PAGE);
Comprobar compresión
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';
Resultado
name data_compression_desc
IX1 PAGE
Reconstruir el índice
ALTER INDEX IX1 on DBO.TEST_INDX rebuild
Comprobar compresión
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'
Resultado
name data_compression_desc
IX1 PAGE
Desactivarlos y luego reconstruirlos tiene un resultado diferente, ya que la desactivación elimina el índice, mientras se mantiene la definición del índice.
alter index IX1 on DBO.TEST_INDX DISABLE ;
alter index IX1 on DBO.TEST_INDX REBUILD ;
Resultado
name data_compression_desc
Se perdió la compresión, la definición de compresión también se perdería al soltar y crear el índice a través de SSMS sin adaptar el script de creación de índice.
¿Por qué?
Debido a que la opción de compresión de datos no se retiene cuando se crea un script para la instrucción de creación de índice.
sin embargo, si deshabilitamos el índice, reconstruimos con compresión y luego reconstruimos nuevamente:
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;
Resultado
name data_compression_desc
IX1 PAGE
Probar una reconstrucción con la solución de mantenimiento de Ola hallengren
Los parámetros se modifican con fines de prueba.
Agregue algunos datos para llegar a una página, ya que son necesarios para el parámetro MinNumberOfPages.
INSERT INTO dbo.TEST_INDX(id,bla)
VALUES(5,'test');
go 10
Ejecute el proceso de optimización de índice para imprimir la declaración.
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;
Resultado:
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
Ejecutando el comando generado
ALTER INDEX [IX1] ON [TestDB].[dbo].[TEST_INDX] REBUILD WITH (SORT_IN_TEMPDB = OFF, ONLINE = ON, RESUMABLE = OFF)
La compresión se retiene
name data_compression_desc
IX1 PAGE
Probar una reconstrucción con un plan de mantenimiento (argumentaría firmemente por la solución de ola)
Reconstruir índices
Elige la mesa de prueba
Agregue algunos niveles de fragmentación de prueba.
Inserte algunos valores para que la fragmentación continúe
INSERT INTO dbo.TEST_INDX(id)
SELECT id from TEST_INDX
go 4
Verificar el porcentaje de fragmentación
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'
Resultado
INDX avg_fragmentation_in_percent page_count
IX1 66,6666666666667 3
Ejecuta el plan
La parte interesante aquí, al mirar el informe del plan, es que la DATA_COMPRESSION = PAGE
opción se agrega al REBUILD
comando generado .
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)
Fragmentación:
INDX avg_fragmentation_in_percent page_count
IX1 0 2
Compresión:
name data_compression_desc
IX1 PAGE