Ich habe eine SQL Server-Datenbank (2008 R2 SP1), die etwa 15 Gigs betrug. Es stellte sich heraus, dass die Wartung schon seit einiger Zeit nicht mehr ausgeführt wurde. Deshalb habe ich einen Wartungsplan erstellt, um alle Indizes neu zu erstellen. Sie waren sehr fragmentiert.
Der Job ist beendet und die Fragmentierung ist weg, aber jetzt ist die Datenbank über 120 Gigs! Ich verstehe, dass es zusätzlichen Speicherplatz für alle Neuerstellungen verwendet hätte, aber jetzt, wo die Arbeit erledigt ist, würde ich annehmen, dass dieser Speicherplatz freier Speicherplatz ist, aber der freie Speicherplatz wird nur als 3 Gigs angezeigt, sodass 117 Gigs verwendet werden obwohl der Index-Neuerstellungsjob beendet ist.
Ich bin sehr verwirrt und könnte eine Anleitung gebrauchen. Ich habe die Datenbank wieder auf eine vernünftige Größe gebracht. Wir haben nicht den Speicherplatz dafür.
Danke im Voraus!
Hier sind die Ergebnisse der beiden Abfragen:
log_reuse_wait_desc NICHTS
name TotalSpaceInMB UsedSpaceInMB FreeSpaceInMB
LIVE_Data 152 123 28
LIVE_Log 18939 89 18849
LIVE_1_Data 114977 111289 3688
Die dritte Datei ist eine .ndf-Datei, die nur 3688 im nicht genutzten Speicherbereich anzeigt, aber 111289 für etwa 15 Gigs Daten.
Das Neuerstellen von Indizes verursacht zusätzlichen Speicherplatz in der Datenbank. Dies ist ein natürliches Nebenprodukt des Neuindizierungsprozesses. Der Server erstellt neben der aktuellen Version eine neue, hoffentlich zusammenhängende Version des Index und löscht die aktuelle Version, wenn sie abgeschlossen ist.
Nach der Neuindizierung zu verkleinern ist sinnlos!
Sie werden den Index nur neu fragmentieren! Durch das Verkleinern wird die Lücke entfernt, indem Daten in der Datenbank neu zugeordnet werden.
Hier ist ein netter Artikel von Paul Randal, der bei Microsoft für den
DBCC
Code verantwortlich war, einschließlich der Verkleinerungen, warum Sie nicht verkleinern sollten.quelle
Sie sollten die Neuaufbauoption verwendet haben
SORT_IN_TEMPDB=ON
.In Ihrem Fall wurden die tatsächlichen Datendateien, in denen sich die fraglichen Tabellen befinden, zum Sortieren der Indizes verwendet. Ein Großteil dieser 120 GB Speicherplatz ist noch nicht belegt und wird bei Bedarf mit Seitendaten gefüllt.
Mit dieser Abfrage können Sie den Status des belegten / freien Speicherplatzes sehen (von hier aus ):
Informationen zum Verkleinern einer bestimmten Datenbankdatei (Daten oder Protokoll) finden Sie hier . Eine Warnung davor, dass das Freigeben von ungenutztem Speicherplatz für Datenbanken mit mehr als 100 GB ziemlich lange dauert (hängt auch von der Speichergeschwindigkeit ab), lassen Sie es also einfach laufen.
quelle
Ich vermute, dass Sie ohne weitere Details eine Transaktionsprotokollsicherung durchführen müssen, um den Speicherplatz freizugeben.
Sehen Sie, was
select name, log_reuse_wait_desc from sys.databases
Ihnen sagt. Wenn in der Spalte log_reuse_wait_desc angegebenLOG_BACKUP
ist, kann kein Speicherplatz mehr beansprucht werden, bis Sie eine Sicherungskopie des Übertragungsprotokolls erstellt haben.quelle