SQL Server 데이터베이스에서 테이블 크기를 결정하는 방법


28

MyTableSQL Server 데이터베이스 의 크기에 대한 정보를 검색하는 데 유용한 내장 함수 / 저장 프로 시저 / 쿼리가 있습니까?


SO에 대한이 답변 에는 매우 간단하고 문서화되지 않은 절차가 필요하지 않은 스크립트가 있습니다.
— Shawn Melton

AA.SC에서 제공하는 답변은 msdb 데이터베이스 식별자를 조인의 모든 DMV에서 제거해야한다는 점을 제외하고 매우 유용합니다. 그것은 그대로 msdb 자체의 테이블에 대해서만보고합니다!
— WaitForPete

답변:


34

단일 테이블의 경우 사용할 수 있습니다

sp_spaceused MyTable

데이터베이스의 모든 테이블에 대해 다음과 sp_msforeachtable같이 사용할 수 있습니다

CREATE TABLE #temp (
table_name sysname ,
row_count INT,
reserved_size VARCHAR(50),
data_size VARCHAR(50),
index_size VARCHAR(50),
unused_size VARCHAR(50))
SET NOCOUNT ON
INSERT #temp
EXEC sp_msforeachtable 'sp_spaceused ''?'''
SELECT a.table_name,
a.row_count,
COUNT(*) AS col_count,
a.data_size
FROM #temp a
INNER JOIN information_schema.columns b
ON a.table_name collate database_default
= b.table_name collate database_default
GROUP BY a.table_name, a.row_count, a.data_size
ORDER BY CAST(REPLACE(a.data_size, ' KB', '') AS integer) DESC
DROP TABLE #temp

45

스크립트를 작성하지 않으려는 경우 SSMS (바로 가기 키 F7)에서 많이 사용되지 않는 '개체 탐색기 정보'를 열 수도 있습니다.

최상위 레벨의 오브젝트 탐색기 세부 사항

최상위 레벨에서 테이블 폴더를 열어 데이터베이스의 모든 테이블 목록을 가져 오십시오.

사용 된 공간을 보려면 열을 사용자 정의해야 할 수도 있습니다. 헤더 행을 마우스 오른쪽 버튼으로 클릭하고 표시하려는 열을 선택하면됩니다.

SSMS의 테이블 데이터 크기

Object Explorer Details에는 이와 같은 더 많은 데이터가 있습니다.


3
위의 t-sql 접근법보다 훨씬 좋았습니다 (나에게 효과적이지 않음)
— Orion Edwards

17

SSMS에서 데이터베이스를 마우스 오른쪽 단추로 클릭하고 보고서, 표준 보고서, 최상위 테이블 별 디스크 사용량을 선택하십시오.

보고서는 테이블 당 사용 된 행 및 킬로바이트 수를 제공합니다.


2

sys.dm_db_partition_stats ( http://msdn.microsoft.com/en-us/library/ms187737.aspx )를 살펴보십시오 .

해당 링크 및 http://blogs.msdn.com/b/cindygross/archive/2010/04/02/dmv-series-sys-dm-db-partition-stats.aspx에 샘플 쿼리가 있습니다.

비 클러스터형 인덱스를 필터링 / 비활성화하여 필요에 맞게 수정할 수 있습니다. 페이지 수에 8을 곱하여 크기 (KB)를 얻은 다음 2 ^ 10 (= 1024)으로 나누어 필요한 경우 MB로 변환합니다.

sp_spaceused ( http://msdn.microsoft.com/en-us/library/ms188776.aspx )도 테이블 크기 정보를 제공합니다.


2

테이블 크기 정보를 얻으려면 다음 스크립트를 사용하고 싶습니다.

SELECT  sc.name + '.' + t.NAME AS TableName,  
        p.[Rows],  
        ( SUM(a.total_pages) * 8 ) / 1024 AS TotalReservedSpaceMB, -- Number of total pages * 8KB size of each page in SQL Server  
        ( SUM(a.used_pages) * 8 ) / 1024 AS UsedDataSpaceMB,  
        ( SUM(a.data_pages) * 8 ) / 1024 AS FreeUnusedSpaceMB  
FROM    msdb.sys.tables t  
        INNER JOIN msdb.sys.schemas sc ON sc.schema_id = t.schema_id  
        INNER JOIN msdb.sys.indexes i ON t.OBJECT_ID = i.object_id  
        INNER JOIN msdb.sys.partitions p ON i.object_id = p.OBJECT_ID  
                                            AND i.index_id = p.index_id  
        INNER JOIN msdb.sys.allocation_units a ON p.partition_id = a.container_id  
WHERE   t.type_desc = 'USER_TABLE'  
        AND i.index_id <= 1  --- Heap\ CLUSTERED
        AND t.NAME='MYTableName' -- Replace with valid table name
GROUP BY sc.name + '.' + t.NAME,  
        i.[object_id],i.index_id, i.name, p.[Rows]  
ORDER BY ( SUM(a.total_pages) * 8 ) / 1024 DESC  

1

데이터베이스로 이동 한 다음 마우스 오른쪽 단추를 클릭하고 보고서를 클릭 한 다음 표준 보고서를 클릭 한 다음 테이블 별 디스크 사용량을 클릭하십시오. 이것은 당신에게 그 데이터베이스의 모든 파일과 그들의 기록, 데이터, 색인 등을 줄 것입니다.


0

각 테이블의 볼륨과 데이터베이스 당 총계의 다른 결과 세트를 계산하는 다음 스크립트를 사용할 수 있습니다.

    SET NOCOUNT ON 
    IF OBJECT_ID('tempdb..#SpaceUsed') IS NOT NULL DROP TABLE #SpaceUsed

    CREATE TABLE #SpaceUsed 
    (
    TableName sysname ,
    [Rows] int ,
    [Reserved] varchar(20),
    [Data] varchar(20),
    [Index_Size] varchar(20),
    [Unused] varchar(20),
    [Reserved_KB] bigint,
    [Data_KB] bigint,
    [Index_Size_KB] bigint,
    [Unused_KB] bigint
    )

    DECLARE @CMD NVARCHAR(MAX) =''
    SELECT @CMD +='EXEC sp_spaceused ' +  ''''+QUOTENAME(TABLE_SCHEMA)+'.'+ QUOTENAME(TABLE_NAME)+''''+';'+CHAR(10)
    FROM INFORMATION_SCHEMA.TABLES 
    --PRINT @CMD

     INSERT INTO #SpaceUsed (TableName ,[Rows] , [Reserved], [Data] , [Index_Size] , [Unused] )
     EXEC sp_executesql @CMD



     UPDATE #SpaceUsed 
     SET [Reserved_KB] = CONVERT(BIGINT,RTRIM(LTRIM(REPLACE([Reserved] , ' KB', '')))),
         [Data_KB] = CONVERT(BIGINT,RTRIM(LTRIM(REPLACE([Data] , ' KB', '')))),
         [Index_Size_KB]= CONVERT(BIGINT,RTRIM(LTRIM(REPLACE([Index_Size] , ' KB', '')))),
         [Unused_KB]= CONVERT(BIGINT,RTRIM(LTRIM(REPLACE([Unused] , ' KB', ''))))


     SELECT TableName, [Rows], Reserved_KB , Data_KB , Index_Size_KB , Unused_KB ,  Data_KB / 1024.0 Data_MB , Data_KB / 1024.0 / 1024.0 Data_GB
     FROM #SpaceUsed
     ORDER BY Data_KB DESC 

     SELECT SUM(Reserved_KB) Reserved_KB , SUM(Data_KB) Data_KB, SUM(Index_Size_KB) Index_Size_KB , SUM(Unused_KB) Unused_KB ,SUM(Data_KB / 1024.0) Data_MB , SUM(Data_KB / 1024.0 / 1024.0) Data_GB
     FROM #SpaceUsed

     DROP TABLE #SpaceUsed
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.