it-swarm.com.de

Wie können Sie feststellen, welche Tabellen den meisten Speicherplatz in einer SQL Server 2005-Datenbank beanspruchen?

Wie können Sie feststellen, welche Tabellen den meisten Speicherplatz in einer SQL Server 2005-Datenbank beanspruchen? 

Ich bin sicher, dass es einige gespeicherte Systemprozeduren gibt, die diese Informationen anzeigen.

Ich habe eine TEST-Datenbank, die von 1 TB auf 23 TB gewachsen ist. Derzeit führen wir viele Client-Konvertierungstests in der Datenbank durch, bei denen die gespeicherte Prozedur der Konvertierung mehrmals ausgeführt wird. Es macht DELETEs, von denen ich sicher bin, dass sie das Transaktionsprotokoll erhöhen. Aber das brachte mich dazu, diese Frage zu stellen.

71
Gerhard Weiss

Versuchen Sie es mit diesem Skript - es listet die Anzahl der Zeilen und den von Datenzeilen verwendeten Speicherplatz (und den gesamten verwendeten Speicherplatz) für alle Tabellen in Ihrer Datenbank auf:

SELECT 
 t.NAME AS TableName,
 i.name AS indexName,
 SUM(p.rows) AS RowCounts,
 SUM(a.total_pages) AS TotalPages, 
 SUM(a.used_pages) AS UsedPages, 
 SUM(a.data_pages) AS DataPages,
 (SUM(a.total_pages) * 8) / 1024 AS TotalSpaceMB, 
 (SUM(a.used_pages) * 8) / 1024 AS UsedSpaceMB, 
 (SUM(a.data_pages) * 8) / 1024 AS DataSpaceMB
FROM 
 sys.tables t
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%' AND
 i.OBJECT_ID > 255 AND  
 i.index_id <= 1
GROUP BY 
 t.NAME, i.object_id, i.index_id, i.name 
ORDER BY 
 OBJECT_NAME(i.object_id) 
174
marc_s

Verwenden Sie sp_spacedUsed

Exec sp_spaceused N'YourTableName'

Oder wenn Sie den sp_spaceused für jede Tabelle in Ihrer Datenbank ausführen möchten, können Sie diese SQL verwenden:

set nocount on
create table #spaceused (
  name nvarchar(120),
  rows char(11),
  reserved varchar(18),
  data varchar(18),
  index_size varchar(18),
  unused varchar(18)
)

declare Tables cursor for
  select name
  from sysobjects where type='U'
  order by name asc

OPEN Tables
DECLARE @table varchar(128)

FETCH NEXT FROM Tables INTO @table

WHILE @@FETCH_STATUS = 0
BEGIN
  insert into #spaceused exec sp_spaceused @table
  FETCH NEXT FROM Tables INTO @table
END

CLOSE Tables
DEALLOCATE Tables 

select * from #spaceused
drop table #spaceused

exec sp_spaceused

Die obige SQL stammt aus hier

31
codingbadger

Rossisdeads Kommentar beantwortete diese Frage am besten für mich, ich wünschte, er wäre nicht in einem Kommentar begraben. Dies ist nützlich für Leute wie mich, die nicht versuchen, die Lösung in ein Skript zu schreiben (das OP hat not nicht nach einem Code-Snippet gefragt)

Wenn Sie Management Studio verwenden, können Sie auch mit der rechten Maustaste auf .__ klicken. Datenbank und gehen Sie zu Reports -> Disk Usage by Table für dasselbe Ergebnisse

6
Hucker

Danke an @marc_s für die Antwort. Ich musste wissen, wie viel Platz für Daten im Vergleich zum Index vorhanden ist. Im Folgenden wird davon ausgegangen, dass Sie einen nicht gruppierten Index für einen Heap haben. Ich habe auch GB geändert:

SELECT TableName
    , SUM(DataRowCounts) AS DataRowCounts
    , SUM(DataTotalSpaceGB) AS DataTotalSpaceGB
    , SUM(DataSpaceUsedGB) AS DataSpaceUsedGB
    , SUM(DataUnusedSpaceGB) AS DataUnusedSpaceGB
    , SUM(IndexRowCounts) AS IndexRowCounts
    , SUM(IndexTotalSpaceGB) AS IndexTotalSpaceGB
    , SUM(IndexSpaceUsedGB) AS IndexSpaceUsedGB
    , SUM(IndexUnusedSpaceGB) AS IndexUnusedSpaceGB
FROM
(
SELECT t.NAME AS TableName
    , i.type_desc AS IndexType
    , CASE WHEN i.type_desc = 'HEAP' THEN CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2)/1000 AS NUMERIC(36, 2)) ELSE 0 END AS DataTotalSpaceGB
    , CASE WHEN i.type_desc = 'HEAP' THEN CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2)/1000 AS NUMERIC(36, 2))  ELSE 0 END AS DataSpaceUsedGB 
    , CASE WHEN i.type_desc = 'HEAP' THEN CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2)/1000 AS NUMERIC(36, 2)) ELSE 0 END AS DataUnusedSpaceGB
    , CASE WHEN i.type_desc = 'HEAP' THEN SUM(p.Rows) ELSE 0 END AS DataRowCounts
    , CASE WHEN i.type_desc = 'NONCLUSTERED' THEN CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2)/1000 AS NUMERIC(36, 2)) ELSE 0 END AS IndexTotalSpaceGB
    , CASE WHEN i.type_desc = 'NONCLUSTERED' THEN CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2)/1000 AS NUMERIC(36, 2))  ELSE 0 END AS IndexSpaceUsedGB    
    , CASE WHEN i.type_desc = 'NONCLUSTERED' THEN CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2)/1000 AS NUMERIC(36, 2)) ELSE 0 END AS IndexUnusedSpaceGB  
    , CASE WHEN i.type_desc = 'NONCLUSTERED' THEN SUM(p.Rows) ELSE 0 END AS IndexRowCounts
FROM sys.tables t
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
LEFT JOIN sys.schemas s ON t.schema_id = s.schema_id
WHERE t.NAME IN ('MyTables')  --update this filter
    AND t.NAME NOT LIKE 'dt%'
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255
    AND s.Name = 'MySchema' --update this filter
GROUP BY t.Name
    , i.type_desc
) x
GROUP BY TableName
0
kbball