it-swarm.com.de

Bleiben komprimierte SQL Server-Indizes beim erneuten Erstellen komprimiert, ohne die Datenkomprimierung anzugeben?

Müssen nachfolgende Neuerstellungen (wie sie von einigen Wartungsskripten nach einem bestimmten Fragmentierungsschwellenwert durchgeführt werden) die Datenkomprimierung erneut angeben, nachdem die SQL Server-Indizes mithilfe der Seitenkomprimierung (ALTER INDEX IX1 REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)) neu erstellt wurden? Würden die Indizes sonst effektiv dekomprimiert?

14

Indizes bleiben beim Neuerstellen/Reorganisieren komprimiert.

Tabelle und komprimierten Index erstellen

 CREATE TABLE DBO.TEST_INDX(id int, bla varchar(255));
 CREATE INDEX IX1 ON dbo.TEST_INDX(id)  WITH (DATA_COMPRESSION = PAGE);

Komprimierung prüfen

 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 

Komprimierung prüfen

 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 Wiederherstellen hat ein anderes Ergebnis, da durch 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 gelöscht und erstellt wurde, ohne dass das Indexerstellungsskript angepasst wurde.

Warum ?

Da die Option data_compression beim Ausschreiben der Index create-Anweisung nicht beibehalten wird.

Wenn wir jedoch den Index deaktivieren, erstellen Sie ihn mit Komprimierung neu und erstellen Sie 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 sie für den Parameter MinNumberOfPages benötigt wird.

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 Komprimierung bleibt erhalten

name    data_compression_desc
IX1 PAGE

Testen eines Umbaus mit einem Wartungsplan (ich würde stark für die Lösung von ola argumentieren)

Indizes neu erstellen

(enter image description here

Wählen Sie die Testtabelle

(enter image description here

Fügen Sie einige Testfragmentierungsstufen hinzu.

(enter image description here

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

(enter image description here

Der interessante Teil hier beim Betrachten des Planberichts ist, dass die Option DATA_COMPRESSION = PAGE Zum generierten Befehl REBUILD 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
23
Randi Vertongen