Ich verwalte eine SQL Server 2005-Datenbank, die ungefähr 2,9 TB Daten hostet (2 x 1,45 TB - Ich habe ein RAW-Schema und ein ANALYSIS-Schema, also im Grunde genommen zwei Kopien der aufgenommenen Daten). Das Wiederherstellungsmodell ist EINFACH und .ldf
liegt bei 6 GB.
Aus welchem Grund auch immer, das .mdf
ist 7,5 TB. Jetzt gibt es nur noch 2-3 zusätzliche Spalten in ANALYSIS-Tabellen und nicht viele NVARCHAR(MAX)
Spalten, die nach meinem Verständnis (möglicherweise falsch verstanden - bitte korrigieren Sie mich, wenn ich falsch liege ) zusätzliche Speicherplatzzuweisung verursachen können. Das ist, nachdem die Datenbank gerade verkleinert wurde - vorher waren es ~ 9 TB. Irgendwelche Gedanken?
Und bitte lassen Sie mich wissen, wenn Sie weitere Fragen haben - ich bin sehr neu in der Datenbankverwaltung und -optimierung (normalerweise mache ich diese Seite des Jobs nicht :)).
Danke vielmals!
Andrija
quelle
Antworten:
Haben Sie bei Ihren Größenschätzungen den Speicherplatz berücksichtigt, den Indizes belegen? Auch wenn Sie Textfelder haben, die als Multibyte (
N[VAR]CHAR
anstatt[VAR]CHAR
) festgelegt sind und die Eingabedateien UTF-8 oder ein einfaches Byte pro Zeichen sind, werden Ihre Speicheranforderungen um den Faktor zwei erhöht. Denken Sie außerdem daran, dass wenn Sie einen Clustered Key / Index in einer Tabelle haben, die Größe dieses Index alle anderen Indizes in der Tabelle beeinflusst, da sie den Clustered Key-Wert für jede Zeile enthalten (um ein extremes Beispiel zu geben, wenn eine Tabelle eine NCHAR hat (10) ) Taste , wo ein INT tun würde , und das ist Ihre gruppierten Schlüssel / Index Sie sind nicht nur eine zusätzliche 16 Byte pro Zeile in den Datenseiten mit verschwenden Sie auch 16 Byte pro Zeile in das auf dieser Tabelle alle anderen Index ) .Außerdem wird etwas Speicherplatz zugewiesen, aber nicht verwendet, entweder weil die DB-Engine nach dem Löschen etwas Speicherplatz zugewiesen hat, damit er schnell wieder für neue Daten in dieser Tabelle verwendet werden kann, oder weil das Muster des Einfügens und Löschens viele Seiten nur teilweise zurückgelassen hat voll.
Du kannst rennen:
um einen schnellen Überblick darüber zu erhalten, welche Tische Platz beanspruchen.
Auch
EXEC sp_spaceused
wird wieder zwei Ergebnismengen innerhalb dieser DB laufen. Der erste listet den gesamten im Dateisystem zugewiesenen Speicherplatz für die Datendateien auf und wie viel davon nicht zugewiesen ist, der zweite listet auf, wie viel des zugewiesenen Speicherplatzes für Datenseiten, für Indexseiten verwendet wird oder derzeit nicht verwendet wird.sp_spaceused
gibt auch den von einem bestimmten Objekt verwendeten Speicherplatz zurück, sodass Sie diesen schleifen können, um eine Tabelle für die Analyse zu erstellen:Der obige Code gibt alle Tabellengrößen in einer Liste sowie eine einzelne Zeile für die Summen aus. Bei Bedarf können Sie die verschiedenen Systemansichten verwenden (wie
sys.objects
undsys.dm_db_partition_stats
in der ersten Abfrage oben verwendet, siehe http://technet.microsoft.com/en-us/library/ms177862.aspx für weitere Details), um weitere Details zu erhalten, wie z Der von jedem Index verwendete Speicherplatz.Es gibt drei Klassen von nicht verwendetem Speicherplatz in einer Datendatei:
sp_spaceused
ohne angegebenes Objekt)sp_spaceused
der Ausgabe.Eine weitere Einschränkung sind große Objekte (
TEXT
Spalten,[N]VARCHAR(MAX)
Werte über einer bestimmten Größe usw.), wenn sie außerhalb der Seite platziert werden, wobei nur 8 Bytes in den Daten der Hauptzeile benötigt werden, um einen Zeiger auf die Daten an anderer Stelle zu halten), wodurch die Grenze von 8.192 Bytes pro Zeile überschritten werden kann.tl; dr: Das Schätzen der erwarteten Datenbankgrößen kann viel komplizierter sein, als es zunächst angenommen wird.
quelle
Versuchen Sie,
sp_spaceused
auf Ihrer Datenbank zu laufen . Als Beispiel wird Folgendes zurückgegeben:Um es in der Datenbank auszuführen, wird nur
USE
die Datenbank ausgeführtsp_spaceused
.Wenn immer noch viel ungenutzter Speicherplatz angezeigt wird, können Sie den Schrumpf erneut versuchen. Manchmal finde ich, dass es mehrere Versuche dauert. Manchmal finde ich es auch am besten, die einzelne Datei und nicht die gesamte Datenbank zu verkleinern. Was Sie jedoch möglicherweise feststellen, ist, dass Sie über 2,9 TB Daten und weitere 4 + TB Indizes verfügen. In diesem Fall sind 7,5 TB ziemlich vernünftig. Wenn Sie ein Gefühl für den Speicherplatz (Daten und Index) jeder Tabelle bekommen möchten, können Sie diese auch
sp_spaceused
auf Tabellenebene ausführen . Sie können es mit dem folgenden Befehl für alle Tabellen in der Datenbank ausführen:Obwohl die faire Warnung sp_msforeachtable nicht dokumentiert ist, nicht unterstützt wird und bekanntermaßen Tabellen fehlen. Andererseits hatte ich selbst ziemlich viel Glück damit.
Abgesehen davon sollte Ihre Datenbank abhängig von Ihrem erwarteten Wachstum einen bestimmten Prozentsatz an freiem Speicherplatz haben. Grundsätzlich möchten Sie sicherstellen, dass Sie Platz für 6 Monate bis zu ein paar Jahren Wachstum haben. Außerdem sollten Sie Ihre
autogrowth
Einstellungen überprüfen , um sicherzustellen, dass sie Ihrer Situation entsprechen. Insbesondere angesichts der Größe Ihrer Datenbank möchten Sie KEIN% verwendenautogrowth
.quelle
Verwenden Sie in SQL Management Studio 1.Rechtsklicken Sie auf die Datenbank und dann 2.Klicken Sie auf Aufgaben-> Verkleinern -> Dateien
Sie sehen einen Dialog, der Folgendes anzeigt: a. Derzeit zugewiesener Speicherplatz b. Verfügbarer freier Speicherplatz + (% frei)
Wenn Ihr% Free über 50% liegt, können Sie die Datei verkleinern. Ich habe diesen Treffer zu 90% gesehen. Wenn ich mich entscheide, die Datei zu verkleinern, setze ich sie normalerweise auf 2 oder 3 Gigs mehr als den aktuell zugewiesenen Speicherplatz. Die meisten meiner Datenbanken haben weniger als 50 GB. Wenn Sie also eine viel größere Datei haben, können Sie diese 10 Gigs groß machen. Ich mache mir normalerweise nur Sorgen um das Verkleinern, wenn ich die Datenbank auf einen anderen Server verschieben möchte. Sie können alles über das Verkleinern von Problemen auf jeder SQL-Seite lesen.
quelle