REBUILD - Clustered Index, TABLE oder beides?

9

Ich habe Probleme, irgendwo eine endgültige Ressource zu finden, also kann mir hoffentlich ein Guru hier eine Antwort geben.

Ich habe eine sehr große Tabelle, zu der wir eine Spalte hinzufügen mussten. Der Clustered-Index ist ziemlich stark fragmentiert, und ich möchte eine ALTER INDEX REBUILDBereinigung durchführen.

Normalerweise mache ich auch eine, ALTER TABLE REBUILDwenn ich die Spalten ändere, da dies alle Zeiger oder Teilungen von dieser Operation bereinigt.

Muss ich beides tun, da es sich um einen Clustered-Index handelt, bei dem es sich im Wesentlichen um die Tabelle handelt?

Mein Verdacht ist, dass ALTER INDEX REBUILDauf dem Cluster nicht alles aktualisiert wird, was der ALTER TABLEWille ist, aber ich befürchte auch, dass der die ALTER TABLEIndexfragmentierung nicht bereinigt.

JNK
quelle
Durch die IIRC-Neuerstellung werden die Spaltenstatistiken nicht aktualisiert. Zweifel, dass dies relevant ist, da es in beiden Fällen nicht passieren wird. :-)
Aaron Bertrand

Antworten:

6

Wenn Sie den Clustered-Index neu erstellen, sollte es nicht erforderlich sein, die Tabelle neu zu erstellen. Wenn die Tabelle ein Heap war (keinen Clustered-Index hatte), möchten Sie sie möglicherweise neu erstellen.

mrdenny
quelle
Ich habe zuvor gelesen, dass Sie beim Entfernen einer Spalte eine ausführen müssen, ALTER TABLE REBUILDda dadurch Zeiger behoben werden, die bei der Indexwiederherstellung nicht behoben wurden. Ist das nicht mehr der Fall?
JNK
Welche Hinweise? Das habe ich noch nie gehört. Das Entfernen einer Spalte hat keine Zeiger, es sei denn, Sie sprechen über TEXT-, NTEXT- und IMAGE-Datentypen in SQL 2000.
mrdenny
1
Ich denke, meine Bedenken sind dann unbegründet ...
JNK
@JNK: Ich vermute, Sie meinen DBCC CLEANTABLE, wenn Sie Spalten löschen, was dem Wiederherstellen des Clustered-Index stackoverflow.com/a/808368/27535 und dba.stackexchange.com/search?q=%2BDBCC+%2BCLEANTABLE
gbn
0

Neu erstellen löscht und erstellt den Index neu. Wenn Sie einen Clustered-Index erstellen, werden zusätzlich zum Erstellen des CIX die Zeilen einer Tabelle neu angeordnet (eine Tabelle ohne CIX ist ein Heap).

Eric Higgins
quelle
4
Beim erneuten Erstellen wird der Clustered-Index nicht gelöscht und neu erstellt. Durch das Löschen des Clustered-Index wird die Tabelle in einen Heap umgewandelt. WENN die Neuerstellung "gelöscht und neu erstellt" würde, müsste es einen Zwischenzustand geben, in dem die Tabelle ein Heap ist, was nicht wahr ist. Wenn Sie mir nicht glauben, dass es keine Zwischen-Heap-Phase gibt, denken Sie daran, dass für das Erreichen dieses Zwischen-Heap-Status eine 'Sortierung' eine Sortierung erfordern würde. Ein kurzer Blick auf den Ausführungsplan für die Neuerstellung zeigt jedoch, dass es keine Sortierung gibt.
Remus Rusanu
Mit freundlichen Grüßen RR, ich lese gerne Ihre Beiträge, bin mir aber nicht sicher, warum Sie diesen Punkt argumentieren würden. Ich habe bereits die offizielle MSDN verlinkt. Aus dem Abschnitt "Indizes neu erstellen" etwa auf halber Höhe, 1. Anweisung: "Das erneute Erstellen eines Index wird gelöscht und der Index neu erstellt." Diese Aussage enthält keine Mehrdeutigkeit. Hier ist es wieder: msdn.microsoft.com/en-us/library/ms188388.aspx
Eric Higgins
1
BOL und MSDN haben möglicherweise von Zeit zu Zeit eine schlechte Wortwahl und dann immer wieder ... Dies wäre ein solcher Fall.
Remus Rusanu