SQL Server 2005 데이터베이스에서 가장 많은 공간을 차지하는 테이블을 어떻게 알 수 있습니까?
SQL Server 2005 데이터베이스에서 가장 많은 공간을 차지하는 테이블을 어떻게 알 수 있습니까?
이 정보를 보여주는 시스템 저장 프로 시저가 있다고 확신합니다.
1tb에서 23tb로 증가한 TEST 데이터베이스가 있습니다. 우리는 현재 데이터베이스에서 많은 클라이언트 변환 테스트를 수행하고 있으며 동일한 변환 저장 프로 시저를 여러 번 실행해야합니다. 트랜잭션 로그가 증가한다고 확신하는 삭제를 수행합니다. 그러나 이것은 제가이 질문을 할 생각을 갖게했습니다.
정보
큰 문제는 dbo.Download 테이블입니다. 실제로 필요하지 않은 대용량 스토리지를 생성합니다. 자르기 전에 3GB가 있었고 그 다음에는 52MB가있었습니다.)
이 스크립트를 사용하면 데이터베이스의 모든 테이블에 대해 데이터 행에 사용 된 행 수와 공간 (및 사용 된 총 공간)이 나열됩니다.
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)
Exec sp_spaceused N'YourTableName'
또는 sp_spaceused
데이터베이스의 각 테이블에 대해 실행하려면 다음 SQL을 사용할 수 있습니다.
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
위의 SQL은 여기에서
Rossisdead의 의견은이 질문에 가장 잘 대답했습니다. 의견에 묻히지 않았 으면 좋겠습니다. 이것은 솔루션을 스크립팅하려고하지 않는 나 같은 사람들에게 유용합니다 (OP는 코드 스 니펫을 요청 하지 않았습니다 )
Management Studio를 사용하는 경우 데이터베이스를 마우스 오른쪽 버튼으로 클릭하고 보고서-> 테이블 별 디스크 사용량으로 이동하여 동일한 결과를 얻을 수도 있습니다.
답변에 대한 @marc_s에게 감사드립니다. 데이터와 인덱스 공간을 알아야했기 때문에 쿼리를 확장하여 포함했습니다.
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
, SUM(DataTotalSpaceGB) + SUM(IndexTotalSpaceGB) AS TotalSpaceGB
FROM
(
SELECT t.NAME AS TableName
, i.type_desc AS IndexType
, CASE WHEN i.type_desc IN ('CLUSTERED', 'CLUSTERED COLUMNSTORE', '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 IN ('CLUSTERED', 'CLUSTERED COLUMNSTORE', '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 IN ('CLUSTERED', 'CLUSTERED COLUMNSTORE', '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 IN ('CLUSTERED', 'CLUSTERED COLUMNSTORE', '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 NOT LIKE 'dt%'
AND t.is_ms_shipped = 0
AND i.OBJECT_ID > 255
AND s.Name = 'dbo' --update this filter
AND t.Name = 'MyTable'
GROUP BY t.Name
, i.type_desc
) x
GROUP BY TableName
ORDER BY TotalSpaceGB DESC
'program story' 카테고리의 다른 글
Visual Studio 2012의 모든 설정을 어떻게 재설정합니까? (0) | 2020.09.23 |
---|---|
SharedPreferences에서 일부 키 / 값 쌍을 제거하는 방법은 무엇입니까? (0) | 2020.09.23 |
다른 gradle buildType에 대해 다른 Android 앱 아이콘을 제공하는 방법은 무엇입니까? (0) | 2020.09.23 |
Windows에서 bash를 사용하려고하는데 설치된 배포 메시지가 없습니다. (0) | 2020.09.23 |
두 요소가 동일한 지 테스트 (0) | 2020.09.23 |