Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Aktuelle Indizes automatisch löschen und neu erstellen

Ich habe ein Skript, mit dem ich die Systemtabellen abfrage, um alle nicht gruppierten Indizes zu erfassen und zu deaktivieren und nach Abschluss neu zu erstellen. Das Folgende gilt für die Verwendung in der Standard Edition. Wenn Sie ein Unternehmen verwenden, würde ich den ONLINE hinzufügen Option.

Deaktivieren

DECLARE @sql AS VARCHAR(MAX);
SET @sql = '';
SELECT 
    @sql = @sql + 'ALTER INDEX [' + i.name + '] ON [' + o.name + '] DISABLE; '
FROM sys.indexes AS i
JOIN sys.objects AS o ON i.object_id = o.object_id
WHERE i.type_desc = 'NONCLUSTERED'
AND o.type_desc = 'USER_TABLE'

EXEC (@sql)

Neu erstellen

DECLARE @sql AS VARCHAR(MAX);
SET @sql = '';
SELECT 
    @sql = @sql + 'ALTER INDEX [' + i.name + '] ON [' + o.name + '] REBUILD WITH (FILLFACTOR = 80); '
FROM sys.indexes AS i
JOIN sys.objects AS o ON i.object_id = o.object_id
WHERE i.type_desc = 'NONCLUSTERED'
AND o.type_desc = 'USER_TABLE'

EXEC (@sql);

Ich mag diese Methode, da sie sehr anpassbar ist, da Sie bestimmte Tabellen basierend auf den Bedingungen ausschließen / einschließen und einen Cursor vermeiden können. Sie können auch die EXEC ändern zu einem PRINT und sehen Sie sich den Code an, der ausgeführt wird, und führen Sie ihn manuell aus.

Bedingung zum Ausschließen einer Tabelle

AND o.name NOT IN ('tblTest','tblTest1');