Bleiben komprimierte SQL Server-Indizes beim Neuerstellen komprimiert, ohne dass Datenkomprimierung angegeben wird?


13

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

Antworten:


22

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

Bildbeschreibung hier eingeben

Wählen Sie die Testtabelle

Bildbeschreibung hier eingeben

Fügen Sie einige Testfragmentierungsstufen hinzu.

Bildbeschreibung hier eingeben

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

Bildbeschreibung hier eingeben

Der interessante Teil hier, wenn man sich den Planbericht ansieht, ist, dass die DATA_COMPRESSION = PAGEOption zum generierten REBUILDBefehl 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

Ich bin auf Ihren Post gestoßen, als ich herausfand, dass 3 Datenbanken, die ich komprimiert hatte, ihre Komprimierung verloren hatten und ich sie erneut anwenden musste. Im Rahmen dieser Arbeit habe ich Ihre Ergebnisse getestet und bestätigt, aber keine Ahnung, wie dies passiert ist. Die einzige andere Möglichkeit, auf die ich gestoßen bin, ist, dass Indizes, die deaktiviert sind, beim Neuaufbau die Komprimierung verlieren. Laut unserem ETL-Team scheint dies nicht der Fall zu sein. Ich habe diese Frage auch auf SQLServerCentral gestellt: sqlservercentral.com/Forums/2017336/Databases-Lost-Compression Völlig ratlos darüber, wie dies geschehen ist.
Wunder

Hallo @Marvel, könnte es sein, dass ein anderer Prozess Indizes auf den Datenbanken neu erstellt? Zum Beispiel führen einige Anwendungen 'Upgrades' durch, bei denen sie unzählige Indizes ablegen und erstellen. Ich glaube jedoch nicht, dass irgendjemand in der Lage sein wird, eine eindeutige Erklärung ohne weitere Einzelheiten abzugeben. Wenn es das nächste Mal passiert, können Sie das Erstellungsdatum des Index ermitteln und feststellen, ob er neu erstellt wurde (z. B. mit der Abfrage in diesem Link: stackoverflow.com/questions/7579932/… . Andernfalls können Sie immer eine Frage stellen, ich jedoch Ich denke, Sie müssten weitere Informationen zur Verfügung stellen.
Randi Vertongen

1
Danke, Randi! Ich habe die SCHEMA_OBJECT_CHANGE_GROUP-Überwachung für die Datenbanken eingerichtet, aber dies wird mir auf jeden Fall helfen, die Protokolle schneller zu analysieren. Ich habe bereits einen der Schuldigen gefunden - den Eigentümer der Datenbanken. Derjenige, der die Komprimierung angefordert hat, hat die Tabellen und Indizes ständig geändert. Er wusste nicht, dass beim Erstellen neuer Tabellen und beim Verschieben der alten Daten in neue Indizes die Komprimierung verloren gehen würde. :( Ich habe mit der richtigen Art und Weise verschaffte ihm seine Tabellen und Indizes zu erstellen glaube ich nicht , dass er der einzige Schuldige ist, aber ich kann mir nicht vorstellen , dass er dies getan hat , e..
Marvel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.