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.