Abrufen der Speichergröße für Tabellen und Indizes auf dem SQL Server

72

Ich möchte Tabellendaten und Indexbereich für jede Tabelle in meiner Datenbank abrufen:

Table Name             Data Space           Index Space
-------------------------------------------------------

Wie kann ich dieses Ergebnis erzielen?

Arian
quelle
43
"Ich möchte <etwas Nützliches tun> <kurz beschrieben, aber so klar wie nötig>" ... Geschlossen als Off-Topic. Top Arbeit, Moderatoren.
Niall Connaughton
3
Zu Ihrer Information, einfach für einen Tischsp_spaceused 'TableName'
Aaron Hoffman

Antworten:

167

Diese Abfrage hier listet die Gesamtgröße auf, die eine Tabelle einnimmt - Clustered-Index, Heap und alle nicht-Clustered-Indizes:

SELECT 
    s.Name AS SchemaName,
    t.NAME AS TableName,
    p.rows AS RowCounts,
    SUM(a.total_pages) * 8 AS TotalSpaceKB, 
    SUM(a.used_pages) * 8 AS UsedSpaceKB, 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
FROM 
    sys.tables t
INNER JOIN 
    sys.schemas s ON s.schema_id = t.schema_id
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
WHERE 
    t.NAME NOT LIKE 'dt%'    -- filter out system tables for diagramming
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255 
GROUP BY 
    t.Name, s.Name, p.Rows
ORDER BY 
    s.Name, t.Name

Wenn Sie den Tabellenbereich vom Indexbereich trennen möchten, müssen Sie ihn AND i.index_id IN (0,1)für den Tabellenbereich ( index_id = 0ist der Heap-Bereich, index_id = 1ist die Größe des gruppierten Index = Datenseiten) und AND i.index_id > 1für den Nur-Index-Bereich verwenden

marc_s
quelle
2
danke lieber @ marc_s.Wenn wir mit der rechten Maustaste auf einen Tabellennamen klicken und Propertiesauf der Registerkarte Speicher auswählen, gibt es Data Spaceund Index Space.Wenn ich diese Zahlen erhalten möchte, was kann ich tun?
Arian
2
@gotqn: Die Seite in SQL Server ist immer 8 KB groß - die Anzahl der Seiten multipliziert mit 8 gibt Ihnen den Betrag in KB an , der belegt wird
marc_s
1
Jeder, der diesen Code verwendet, möchte wahrscheinlich die Bedingung "t.NAME NOT LIKE 'dt%'" aus der WHERE-Klausel entfernen. Ich kann nicht erraten, warum es dort ist.
MikeB
1
@ MikeB: Es ist da, um die verschiedenen installierten Systemtabellen herauszufiltern, wenn Sie die Datenbankdiagrammfunktionen von SQL Server verwenden
marc_s
1
Die Anzahl der Zeilen sollte aus der GROUP BY-Klausel entfernt und RowCounts als SUM (CASE WHEN (i.index_id = 0) ODER (i.index_id = 1) THEN p.rows ELSE 0 END) AS RowCounts
Pavel Nefyodov
14
with pages as (
    SELECT object_id, SUM (reserved_page_count) as reserved_pages, SUM (used_page_count) as used_pages,
            SUM (case 
                    when (index_id < 2) then (in_row_data_page_count + lob_used_page_count + row_overflow_used_page_count)
                    else lob_used_page_count + row_overflow_used_page_count
                 end) as pages
    FROM sys.dm_db_partition_stats
    group by object_id
), extra as (
    SELECT p.object_id, sum(reserved_page_count) as reserved_pages, sum(used_page_count) as used_pages
    FROM sys.dm_db_partition_stats p, sys.internal_tables it
    WHERE it.internal_type IN (202,204,211,212,213,214,215,216) AND p.object_id = it.object_id
    group by p.object_id
)
SELECT object_schema_name(p.object_id) + '.' + object_name(p.object_id) as TableName, (p.reserved_pages + isnull(e.reserved_pages, 0)) * 8 as reserved_kb,
        pages * 8 as data_kb,
        (CASE WHEN p.used_pages + isnull(e.used_pages, 0) > pages THEN (p.used_pages + isnull(e.used_pages, 0) - pages) ELSE 0 END) * 8 as index_kb,
        (CASE WHEN p.reserved_pages + isnull(e.reserved_pages, 0) > p.used_pages + isnull(e.used_pages, 0) THEN (p.reserved_pages + isnull(e.reserved_pages, 0) - p.used_pages + isnull(e.used_pages, 0)) else 0 end) * 8 as unused_kb
from pages p
left outer join extra e on p.object_id = e.object_id

Berücksichtigt interne Tabellen, wie sie beispielsweise für die XML-Speicherung verwendet werden.

Bearbeiten: Wenn Sie die Werte data_kbund index_kbdurch 1024.0 teilen, erhalten Sie die Zahlen, die Sie in der GUI sehen.

Muhmud
quelle