Ist es möglich, zwei DBCC INDEXDEFRAG-Befehle gleichzeitig in einer anderen Tabelle auszuführen?

9

Ich führe derzeit ein Skript aus, das eine DBCC INDEXDEFRAG für jede Tabelle in einer SQL Server 2005-Datenbank nacheinander ausführt. Die Verwendung von DBCC DBREINDEX anstelle von INDEXDEFRAG ist aus Platzgründen und aufgrund von Verfügbarkeitsanforderungen keine Option.

Ich habe festgestellt, dass es lange dauert, bis bestimmte Tabellen defragmentiert sind. Wenn ich beispielsweise die dynamische Verwaltungsansicht "sys.dm_exec_requests" untersuche, kann ich feststellen, dass der folgende INDEXDEFRAG derzeit den Clustered-Index einer Tabelle mit einer table_id von 829610394 abläuft:

DBCC INDEXDEFRAG (0, 829610394, 1)

Ich weiß, dass es lange dauern wird, bis der Defragmentierungsprozess abgeschlossen ist. Abgesehen von der Tatsache, dass das aktuell ausgeführte Skript möglicherweise alle Tabellen defragmentiert, kann es mir schaden, wenn ich manuell einen anderen DBCC INDEXDEFRAG für den Clustered-Index einer anderen Tabelle ausführe, während der aktuelle Befehl ausgeführt wird? Werden in diesem Fall beide Tabellen gleichzeitig defragmentiert?

RelentlessMike
quelle

Antworten:

15

Ja, Sie können dies für mehrere Tabellen tun. Sie können dies nicht für mehrere Indizes in derselben Tabelle tun. Ich habe eine neue Subressource für die Indexsperre erfunden, um dies zu verhindern. Gleiches Verhalten in ALTER INDEX ... REORGANISIEREN, durch das ich es 2005 ersetzt habe.

Vielen Dank

Paul S. Randal
quelle
2
Sie können keine genauere Antwort erhalten als eine von der Person, die sie geschrieben hat! Vergessen Sie nicht die E / A-Last, die mit mehreren Neuerstellungen oder Reorgs gleichzeitig verbunden ist, und verwenden Sie in Zukunft ALTER INDEX anstelle des DBCC-Befehls.
AndrewSQL
Einverstanden, ich weiß nicht, wie es möglich wäre, eine genauere Antwort auf dieses spezielle Problem zu erhalten als eine von Paul Randal. Danke Paul.
RelentlessMike
6

Beachten Sie, dass DBCC INDEXDEFRAG & DBREINDEX veraltet sind und durch ALTER INDEX ersetzt werden:

Wichtig

Diese Funktion wird in einer zukünftigen Version von Microsoft SQL Server entfernt. Verwenden Sie diese Funktion nicht in neuen Entwicklungsarbeiten und ändern Sie Anwendungen, die diese Funktion derzeit verwenden, so schnell wie möglich. Verwenden Sie stattdessen ALTER INDEX. - http://msdn.microsoft.com/en-us/library/ms177571(v=SQL.90).aspx

Die gleichzeitige Ausführung von zwei Dateien hängt von Ihrem Dateilayout ab. Wenn sie sich alle auf derselben (n) Festplatte (n) befinden, würden Sie sie wahrscheinlich verlangsamen, da sie für E / A gegeneinander kämpfen würden. Am besten REORG oder REBUILD nur bei Bedarf. Eine automatisierte Lösung finden Sie hier im Skript von Michelle Ufford: http://sqlfool.com/2010/04/index-defrag-script-v4-0/

Eric Humphrey - Lotsahelp
quelle
Danke Eric. In diesem speziellen Fall ist die Datenbank auf mehrere Datendateien, auf verschiedenen Partitionen und auf einem IBM DS8300-SAN verteilt. Also denke ich, dass ich in Ordnung bin, was I / O betrifft.
RelentlessMike