Index Rebuild MS SQL Server

Aus HB9FDZ
Zur Navigation springen Zur Suche springen

SQL Server: Index‑Wartung (Standard Edition)

[Bearbeiten | Quelltext bearbeiten]

Diese Dokumentation beschreibt, wie in einer Microsoft SQL Server Standard Edition die Indizes einer Datenbank gewartet werden. Da die Standard Edition keine Online‑Rebuilds unterstützt, müssen Rebuilds außerhalb der Betriebszeiten durchgeführt werden.

1. Fragmentierung prüfen

[Bearbeiten | Quelltext bearbeiten]

Um festzustellen, wie stark die Indizes fragmentiert sind:

SELECT 
    dbschemas.[name] AS 'Schema',
    dbtables.[name] AS 'Table',
    dbindexes.[name] AS 'Index',
    indexstats.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, 'LIMITED') AS indexstats
INNER JOIN sys.tables dbtables ON dbtables.[object_id] = indexstats.[object_id]
INNER JOIN sys.schemas dbschemas ON dbtables.[schema_id] = dbschemas.[schema_id]
INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
    AND indexstats.index_id = dbindexes.index_id
WHERE indexstats.avg_fragmentation_in_percent > 5
ORDER BY indexstats.avg_fragmentation_in_percent DESC;

Interpretation:

5–30 % → REORGANIZE

>30 % → REBUILD (offline in Standard Edition)

2. Statistiken aktualisieren (empfohlen vor jedem Rebuild)

[Bearbeiten | Quelltext bearbeiten]

Kann jederzeit im laufenden Betrieb ausgeführt werden.

EXEC sp_updatestats;

3. Index‑Rebuild aller Tabellen (Standard Edition, offline)

[Bearbeiten | Quelltext bearbeiten]

Dieser Schritt sollte außerhalb der Betriebszeiten ausgeführt werden, da Tabellen während des Rebuilds gesperrt werden.

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql = @sql + 
    'ALTER INDEX [' + i.name + '] ON [' + s.name + '].[' + t.name + '] REBUILD WITH (ONLINE = OFF);' + CHAR(13)
FROM sys.indexes i
JOIN sys.tables t ON i.object_id = t.object_id
JOIN sys.schemas s ON t.schema_id = s.schema_id
WHERE i.type_desc <> 'HEAP'
  AND i.is_disabled = 0;

EXEC sp_executesql @sql;

Hinweise:

HEAP‑Tabellen (ohne Clustered Index) werden übersprungen.

Während des Rebuilds sind Tabellen exklusiv gesperrt.

Dauer bei 200k–1 Mio Zeilen meist nur Sekunden bis wenige Minuten.

4. Optional: Index‑Reorganize (online, tagsüber möglich)

[Bearbeiten | Quelltext bearbeiten]

Kann im laufenden Betrieb ausgeführt werden, blockiert nicht.

ALTER INDEX ALL ON dbo.DeineTabelle REORGANIZE;

Einsatz: Nur sinnvoll bei Fragmentierung unter 30 %.

5. Fehlende Indizes prüfen

[Bearbeiten | Quelltext bearbeiten]

SQL Server zeigt an, welche Indizes fehlen und Performance verbessern würden:

SELECT *
FROM sys.dm_db_missing_index_details;

Hinweis: Diese Vorschläge sind oft wertvoll, aber nicht blind übernehmen — prüfen, ob sie zur Abfrage passen.

6. Empfohlene Wartungsroutine

[Bearbeiten | Quelltext bearbeiten]

Täglich / wöchentlich:

  • sp_updatestats
  • REORGANIZE bei Fragmentierung 5–30 %
  • Monatlich / bei Bedarf: REBUILD aller Indizes (außerhalb der Betriebszeiten)

Hinweis zu Tabellen mit BLOB‑Daten

[Bearbeiten | Quelltext bearbeiten]

Tabellen, die große Datenfelder enthalten (z. B. VARBINARY(MAX), VARCHAR(MAX), NVARCHAR(MAX), XML), können ohne Einschränkungen in den Index‑Rebuild einbezogen werden.

Grund: SQL Server speichert große Objekte (LOB‑Daten) nicht direkt im Index, sondern auf separaten LOB‑Pages. Der Index enthält lediglich einen Verweis auf diese Daten.

Folgen für den Rebuild:

LOB‑Daten werden nicht neu geschrieben

nur die Indexstruktur wird reorganisiert

der Vorgang ist sicher und verursacht keine Datenverluste

die Dauer des Rebuilds wird durch BLOB‑Daten kaum beeinflusst

Ausnahme: Beim Rebuild eines Clustered Index werden die Zeilen neu angeordnet, jedoch bleiben die LOB‑Daten weiterhin ausgelagert. Auch hier werden die BLOB‑Daten selbst nicht vollständig neu geschrieben.