Wie kann ich feststellen, durch welche Tabellen die Datenbank im Laufe der Zeit wächst?

8

Ich habe eine Datenbank in SQL Server 2008, die ständig wächst, und ich möchte wissen, welche Tabellen in den letzten 6 Monaten das größte Wachstum verursacht haben.

kashif
quelle
Sie können eine Kombination aus T-SQL und PowerShell - Überwachen des Tabellenwachstums mit PowerShell verwenden , um es zu überwachen und im Laufe der Zeit zu entwickeln.
Kin Shah
Wie weit zurück haben Sie Backups? Sie können die älteren wiederherstellen und sich die Tabellen ansehen, die Informationen aufzeichnen und nach jeder Wiederherstellung auf diese Weise vergleichen.
Ali Razeghi
Welche Informationen haben Sie in Ihren Tabellen? Wenn es sich um Auditing-Typ-Informationen handelt, wie z. B. einen last_updated_atZeitstempel, können Sie einige fundierte Vermutungen anstellen.
Clockwork-Muse
Sie können diese vorherige Antwort für einen Starter überprüfen . Aber höchstwahrscheinlich ist Aarons Liste der richtige Weg, um eine Lösung auszuwählen und darauf aufzubauen. Überprüfen Sie auch, was wächst. Handelt es sich um die Datendatei oder um die Protokolldatei?
Marian

Antworten:

15

SQL Server verfolgt diese Informationen nicht. Sie benötigen eine Art Überwachung (ob es sich um ein Tool handelt oder um ein selbst entwickeltes Tool), mit dem Sie in Zukunft Momentaufnahmen des Tabellenbereichs erstellen können. Dies kann einfach oder komplex sein:

  • Anzeigen des Berichts @Zane hebt in seiner Antwort hervor und speichert die Datei von Zeit zu Zeit.
  • Machen Sie Ihre eigenen regelmäßigen Schnappschüsse von Ansichten wie sys.dm_db_partition_stats;
  • Wenn Sie sich wiederhergestellte Kopien älterer Sicherungen ansehen , wie von @Ali vorgeschlagen - wer weiß jedoch, wie weit Ihre Sicherungen gehen, und wenn Speicherplatz ein Problem darstellt, haben Sie möglicherweise nicht den Luxus, eine Reihe von Sicherungen für Vergleiche nebeneinander wiederherzustellen wie auch immer.
  • Verwenden eines externen Tools wie PowerShell zur Automatisierung, wie im Artikel @Kin hervorgehoben ;
  • Verwendung eines vollständigen Überwachungstools, das Speicherplatz, Fragmentierung usw. im Laufe der Zeit verfolgt (Haftungsausschluss: Ich arbeite für SQL Sentry).

Ohne eine oder mehrere dieser Methoden bereits implementiert zu haben oder jemanden, der eine Zeitmaschine erfindet, gibt es keinen guten Weg, um herauszufinden, wie groß ein Tisch vor 6 Monaten, vor zwei Wochen oder vor 20 Minuten war.

Aaron Bertrand
quelle
13

Wenn Sie diese Metriken nicht irgendwie erfasst und gespeichert haben, gibt es keine Möglichkeit, den Verlauf anzuzeigen. Sie können jedoch ziemlich leicht erkennen, welche Tabellen derzeit die meisten Festplatten verwenden, wenn dies hilfreich ist.

Rechtsklick

Zane
quelle
2

Ich führe dies täglich in einer Kundendatenbank aus, um das Wachstum einzelner Tabellen im Laufe der Zeit zu verfolgen.

DECLARE @names TABLE (
 tableName VARCHAR(128)
 )

INSERT INTO @names
SELECT [name] FROM customerdb.dbo.sysobjects WHERE xtype='U'

WHILE (SELECT COUNT(tableName) FROM @names) > 0
BEGIN

    DECLARE @thisTable VARCHAR(128)
    SET @thisTable = (SELECT TOP 1 tableName FROM @names)
    INSERT INTO mydb.dbo.mytable ([name], [rows], [reserved], [data], [index_size], [unused])
    EXEC sp_spaceused @objname=@thisTable

    DELETE FROM @names
    WHERE tableName = @thisTable

END
user41207
quelle
1

Ich habe einen SQL-Skript-Zeitplan für einen Job, der jede Woche ausgeführt werden soll. Versuchen Sie, ein Skript zu schreiben, das alle Informationen von sp_spaceused, sys.schemas und sys.tables abruft. und legen Sie das in eine Tabelle mit dem Erstellungsdatum. (und Sie können mit der Überwachung für die Zukunft beginnen)

Wenn Sie jedoch das Tabellenwachstum für die letzten Monate ermitteln möchten und kein Skript oder keinen Job eingerichtet haben, müssen Sie wahrscheinlich die Sicherung in einer Testumgebung wiederherstellen, die höchste Tabelle anzeigen und vergleichen, wie stark sie gewachsen ist durch die Zeit.

Lydia Simeane
quelle
5
Warum nicht dein Skript teilen?
Erik Darling
-2

Wie mache ich das in MySQL ohne zusätzliche Tools:

Führen Sie eine Abfrage wie "SHOW TABLE STATUS" aus und speichern Sie das Ergebnis in einer Tabelle mit einem zusätzlichen Zeitstempelfeld.

Mit diesen Daten haben Sie einen Verlauf jeder Tabelle und können Ihre Tabellen nach Datenlänge, Zeilen oder größtem Unterschied auswählen. im Laufe der Zeit.

Da die Statusdaten nicht viele Bytes enthalten, können Sie sie mit einem täglichen Cronjob ausführen. Läuft perfekt, einfach und kostenlos mit integrierten Befehlen.

.

Gleiches Verfahren wie der Link, den Marian zuvor gepostet hat. Der MS T-SQL-Befehl sollte etwa "SELECT * FROM INFORMATION_SCHEMA.TABLES" lauten - einfach google. Ich habe in Sekunden 2 mögliche Lösungen gefunden:

Auflisten aller Tabellen in einer Datenbank sowie deren Zeilenanzahl und -größe: http://www.sqlmatters.com/Articles/Listing%20all%20tables%20in%20a%20database%20and%20their%20row%20counts%20and%20sizes.aspx

SQL SERVER - Abfrage zum Finden der Anzahl der Zeilen, Spalten und ByteSize für jede Tabelle: http://blog.sqlauthority.com/2007/01/10/sql-server-query-to-find-number-rows-columns-bytesize- für-jede-Tabelle-in-der-aktuellen-Datenbank-finden-größte-Tabelle-in-Datenbank /

Rossi
quelle