Ich habe eine ziemlich große SQL Server-Datenbank geerbt. Angesichts der darin enthaltenen Daten scheint es mehr Platz in Anspruch zu nehmen, als ich erwarten würde.
Gibt es eine einfache Möglichkeit, um festzustellen, wie viel Speicherplatz jede Tabelle auf der Festplatte belegt?
sql-server
tsql
Eric
quelle
quelle
Antworten:
quelle
Wenn Sie SQL Server Management Studio (SSMS) verwenden, können Sie anstelle einer Abfrage ( die in meinem Fall doppelte Zeilen zurückgibt) einen Standardbericht ausführen .
Hinweis: Die Datenbankkompatibilitätsstufe muss auf 90 oder höher eingestellt sein, damit dies ordnungsgemäß funktioniert. Siehe http://msdn.microsoft.com/en-gb/library/bb510680.aspx
quelle
Mit sp_spaceused erhalten Sie Informationen zum Speicherplatz, der von einer Tabelle, einer indizierten Ansicht oder der gesamten Datenbank verwendet wird.
Zum Beispiel:
Hier werden die Informationen zur Datenträgernutzung für die ContactInfo-Tabelle angezeigt.
So verwenden Sie dies für alle Tabellen gleichzeitig:
Sie können die Festplattennutzung auch über die Rechtsklick-Funktion "Standardberichte" von SQL Server abrufen. Um zu diesem Bericht zu gelangen, navigieren Sie im Objekt-Explorer vom Serverobjekt, gehen Sie zum Datenbankobjekt und klicken Sie mit der rechten Maustaste auf eine Datenbank. Wählen Sie im angezeigten Menü Berichte, dann Standardberichte und dann "Datenträgernutzung nach Partition: [Datenbankname]".
quelle
sp_msforeachtable
in SSMS leicht eine auslösen kann,System.OutOfMemoryException
wenn Sie eine große Anzahl von Tabellen haben. Daher ist es möglicherweise besser, eine temporäre Tabelle zum Speichern der Ergebnisse zu verwenden.Hier ist eine andere Methode: Gehen Sie mit SQL Server Management Studio im Objekt-Explorer zu Ihrer Datenbank und wählen Sie Tabellen aus
Öffnen Sie dann die Objekt-Explorer-Details (entweder durch Drücken von F7 oder gehen Sie zu Ansicht-> Objekt-Explorer-Details ). Klicken Sie auf der Detailseite des Objekt-Explorers mit der rechten Maustaste auf die Spaltenüberschrift und aktivieren Sie die Spalten, die auf der Seite angezeigt werden sollen. Sie können die Daten auch nach einer beliebigen Spalte sortieren.
quelle
Nach einiger Suche konnte ich keine einfache Möglichkeit finden, Informationen zu allen Tabellen zu erhalten. Es gibt eine praktische gespeicherte Prozedur mit dem Namen sp_spaceused, die den gesamten von der Datenbank verwendeten Speicherplatz zurückgibt. Wenn ein Tabellenname angegeben wird, wird der von dieser Tabelle verwendete Speicherplatz zurückgegeben. Die von der gespeicherten Prozedur zurückgegebenen Ergebnisse sind jedoch nicht sortierbar, da die Spalten Zeichenwerte sind.
Das folgende Skript generiert die gesuchten Informationen.
quelle
Verwenden Sie für alle Tabellen .. (aus den Kommentaren von Paul)
quelle
exec sp_helpdb
denen nicht zeigen nichts über Tabellen, zuexec sp_spaceused
denen tut - aber nur für eine Tabelle zu einer Zeit ... es nicht Sie einen Überblick über das , was Tabellen Sie haben und wie viel Reihen sie haben und wie viel Platz nehmen sie ein.Die obigen Abfragen eignen sich gut zum Ermitteln des von der Tabelle verwendeten Speicherplatzes (einschließlich Indizes). Wenn Sie jedoch vergleichen möchten, wie viel Speicherplatz von Indizes in der Tabelle verwendet wird, verwenden Sie diese Abfrage:
quelle
where [i].[is_primary_key] = 0
. Jetzt sollten die Größen übereinstimmen.sp_spaceused
. Ich messe GBs, so dass ein paar Megas, die nicht übereinstimmen, nicht viel sind. Die genauen Größen sind mir egal, nur eine Idee.Wenn Sie genau dieselben Zahlen berechnen müssen, die sich in SSMS auf der Seite "Tabelleneigenschaften - Speicher" befinden, müssen Sie sie mit derselben Methode zählen wie in SSMS (funktioniert für SQL Server 2005 und höher ... und auch) funktioniert korrekt für Tabellen mit LOB-Feldern - da das bloße Zählen von "used_pages" nicht ausreicht, um die genaue Indexgröße anzuzeigen):
quelle
Erweiterung auf @ xav- Antwort , die Tabellenpartitionen verarbeitet, um die Größe in MB und GB zu ermitteln. Getestet auf SQL Server 2008/2012 (Kommentar in einer Zeile, in der
is_memory_optimized = 1
)quelle
Für Azure habe ich Folgendes verwendet:
Sie sollten SSMS v17.x haben
Ich benutzte;
Damit hat User Sparrow Folgendes erwähnt :
Öffnen Sie Ihr
Databases
> und wählen Sie Tabellen .Drücken Sie dann die Taste F7. Sie sollten Folgendes sehen
row count
:
SSMS ist hier mit Azure-Datenbanken verbunden
quelle
Wir verwenden die Tabellenpartitionierung und hatten aufgrund doppelter Datensätze Probleme mit den oben angegebenen Abfragen.
Für diejenigen, die dies benötigen, finden Sie unten die Abfrage, die von SQL Server 2014 ausgeführt wird, wenn der Bericht "Datenträgerverwendung nach Tabelle" generiert wird. Ich gehe davon aus, dass es auch mit früheren Versionen von SQL Server funktioniert.
Es wirkt wie ein Zauber.
quelle
quelle
Eine kleine Änderung in Mar_cs Antwort , da ich so oft auf diese Seite zurückgegangen bin, geordnet nach den meisten Zeilen zuerst:
quelle
Dadurch erhalten Sie die Größen und die Anzahl der Datensätze für jede Tabelle.
quelle
{ }
) in der Editor-Symbolleiste, um sie gut zu formatieren und in der Syntax hervorzuheben!Um alle Tabellengrößen in einer Datenbank abzurufen, können Sie folgende Abfrage verwenden:
Sie können es ändern, um das gesamte Ergebnis in die temporäre Tabelle einzufügen, und anschließend aus der temporären Tabelle auswählen.
quelle
An einer Eingabeaufforderung mit OSQL :
quelle
Mit den folgenden Schritten können Sie die Größe aller Tabellen schnell ermitteln:
Schreiben Sie die angegebenen T-SQL-Befehle, um alle Datenbanktabellen aufzulisten:
Kopieren Sie nun die Liste der Datenbanktabellen und kopieren Sie sie in ein neues Query Analyzer-Fenster
Wählen Sie im SQL Query Analyzer aus der oberen Symbolleiste die Option Ergebnisse in Datei ( Ctrl+ Shift+ F).
Nun endlich auf die Execute roten Knopf von oben markiert Werkzeugleiste .
Die Datenbankgröße aller Tabellen wird jetzt in einer Datei auf Ihrem Computer gespeichert.
quelle
Ich habe ein paar weitere Spalten über marc_s Antwort hinzugefügt:
quelle
Mein Beitrag ist nur für SQL Server 2000 relevant und wurde getestet, um in meiner Umgebung zu funktionieren.
Dieser Code greift auf alle möglichen Datenbanken einer einzelnen Instanz zu , nicht nur auf eine einzelne Datenbank.
Ich verwende zwei temporäre Tabellen, um die entsprechenden Daten zu sammeln und die Ergebnisse dann in einer 'Live'-Tabelle abzulegen.
Zurückgegebene Daten sind: DatabaseName, DatabaseTableName, Zeilen (in der Tabelle), Daten (Größe der Tabelle in KB, wie es scheint), Eingabedaten (ich finde dies nützlich, um zu wissen, wann ich das Skript zuletzt ausgeführt habe).
Der Nachteil dieses Codes ist, dass das Feld 'data' nicht als int gespeichert wird (die Zeichen 'KB' werden in diesem Feld gespeichert), und dies wäre nützlich (aber nicht unbedingt erforderlich) für die Sortierung.
Hoffentlich hilft dieser Code jemandem da draußen und spart ihm Zeit!
Falls Sie wissen müssen, wurde die Tabelle rsp_DatabaseTableSizes erstellt durch:
quelle
Als einfache Erweiterung der Antwort von marc_s (die angenommen wurde) wird diese angepasst, um die Spaltenanzahl zurückzugeben und das Filtern zu ermöglichen:
quelle
Beim Riffing der obigen @ Mark-Antwort wurde @ updateusage = 'true' hinzugefügt, um die neuesten Größenstatistiken zu erzwingen ( https://msdn.microsoft.com/en-us/library/ms188776.aspx ):
quelle
Hier ist eine Beispielabfrage, um Tabellen größer als 1 GB nach absteigender Größe zu erhalten.
quelle