SQL Server 2005 데이터베이스에서 어떤 테이블이 가장 많은 공간을 차지하는지 어떻게 알 수 있습니까?
SQL Server 2005 데이터베이스에서 어떤 테이블이 가장 많은 공간을 차지하는지 어떻게 알 수 있습니까?
이 정보를 보여주는 System Stored Procedure가 있을 것입니다.
1tb에서 23tb로 늘어난 TEST 데이터베이스가 있습니다.현재 데이터베이스에서 많은 클라이언트 변환 테스트를 수행하고 있으며, 동일한 변환 스토어드 프로시저를 여러 번 실행해야 합니다.DELETE를 실행하므로 트랜잭션 로그가 증가합니다.하지만 이 일로 나는 이 질문을 해야겠다고 생각하게 되었다.
정보
가장 큰 문제는 dbo입니다.다운로드 테이블은 실제로 필요하지 않은 대용량 스토리지를 생성합니다. 잘라내기 전에 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)
sp_spaced Used 사용
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를 사용하는 경우 데이터베이스를 마우스 오른쪽 버튼으로 클릭하여 [Reports]-> [ Disk Usage by Table ](표별 디스크 사용량)으로 이동할 수도 있습니다.
답변을 주신 @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
언급URL : https://stackoverflow.com/questions/3927231/how-can-you-tell-what-tables-are-taking-up-the-most-space-in-a-sql-server-2005-d
'programing' 카테고리의 다른 글
이중 괄호 또는 단일 괄호, 괄호, 컬리 괄호 사용 방법 (0) | 2023.04.16 |
---|---|
시트가 있는지 테스트 또는 확인 (0) | 2023.04.16 |
FullRow 선택 모드에서 DataGrid 현재 셀 테두리 사용 안 함 (0) | 2023.04.16 |
Swift - 시/분/초로 정수 변환 (0) | 2023.04.16 |
TextBox에 추가하는 이유는 무엇입니까?루프 중에 텍스트가 반복될 때마다 더 많은 메모리를 차지합니까? (0) | 2023.04.16 |