Indizes bleiben beim Neuaufbau / Reorganisieren komprimiert.
Erstellen Sie eine Tabelle und einen komprimierten Index
CREATE TABLE DBO.TEST_INDX(id int, bla varchar(255));
CREATE INDEX IX1 ON dbo.TEST_INDX(id) WITH (DATA_COMPRESSION = PAGE);
Überprüfen Sie die Komprimierung
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';
Ergebnis
name data_compression_desc
IX1 PAGE
Erstellen Sie den Index neu
ALTER INDEX IX1 on DBO.TEST_INDX rebuild
Überprüfen Sie die Komprimierung
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'
Ergebnis
name data_compression_desc
IX1 PAGE
Das Deaktivieren und anschließende Neuerstellen führt zu einem anderen Ergebnis, da durch das Deaktivieren der Index entfernt wird, während die Indexdefinition beibehalten wird.
alter index IX1 on DBO.TEST_INDX DISABLE ;
alter index IX1 on DBO.TEST_INDX REBUILD ;
Ergebnis
name data_compression_desc
Die Komprimierung ging verloren, die Komprimierungsdefinition ging auch verloren, wenn der Index über SSMS abgelegt und erstellt wurde, ohne das Indexerstellungsskript anzupassen.
Warum?
Da die Option data_compression beim Ausarbeiten der Anweisung Index create nicht beibehalten wird.
Wenn wir jedoch den Index deaktivieren, erstellen Sie ihn mit Komprimierung neu und erstellen ihn dann erneut:
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;
Ergebnis
name data_compression_desc
IX1 PAGE
Testen eines Umbaus mit der Wartungslösung von Ola Hallengren
Die Parameter werden zu Testzwecken geändert.
Fügen Sie einige Daten hinzu, um zu einer Seite zu gelangen, wie dies für den Parameter MinNumberOfPages erforderlich ist.
INSERT INTO dbo.TEST_INDX(id,bla)
VALUES(5,'test');
go 10
Führen Sie den Indexoptimierungsprozess aus, um die Anweisung auszudrucken.
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;
Ergebnis:
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
Ausführen des generierten Befehls
ALTER INDEX [IX1] ON [TestDB].[dbo].[TEST_INDX] REBUILD WITH (SORT_IN_TEMPDB = OFF, ONLINE = ON, RESUMABLE = OFF)
Die Kompression bleibt erhalten
name data_compression_desc
IX1 PAGE
Testen eines Umbaus mit einem Wartungsplan (ich würde mich nachdrücklich für Olas Lösung aussprechen)
Indizes neu erstellen
Wählen Sie die Testtabelle
Fügen Sie einige Testfragmentierungsstufen hinzu.
Fügen Sie einige Werte ein, um die Fragmentierung in Gang zu bringen
INSERT INTO dbo.TEST_INDX(id)
SELECT id from TEST_INDX
go 4
Überprüfen Sie den Fragmentierungsprozentsatz
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'
Ergebnis
INDX avg_fragmentation_in_percent page_count
IX1 66,6666666666667 3
Führen Sie den Plan aus
Der interessante Teil hier, wenn man sich den Planbericht ansieht, ist, dass die DATA_COMPRESSION = PAGE
Option zum generierten REBUILD
Befehl hinzugefügt wird !
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)
Zersplitterung:
INDX avg_fragmentation_in_percent page_count
IX1 0 2
Kompression:
name data_compression_desc
IX1 PAGE