Basic Byte Bites

MS-SQL 테이블 용량 조회 쿼리 (+ 간단한 설명) 본문

DataBase/MS_SQL

MS-SQL 테이블 용량 조회 쿼리 (+ 간단한 설명)

MKJo 2024. 7. 31. 15:08

MSSQL에서 테이블이 차지하는(할당된) 용량을 확인하기 위해서는 sys 스키마의 allocation_units 뷰값을 통해 확인한다.

select * from sys.allocation_units
total_pages와 used_pages값을 이용하여 계산

 

 

 

 

 

참조

https://learn.microsoft.com/ko-kr/sql/relational-databases/pages-and-extents-architecture-guide?view=sql-server-ver15

 

페이지 및 익스텐트 아키텍처 가이드 - SQL Server

이 가이드에서는 모든 SQL Server 버전에서 페이지 및 익스텐트를 관리하는 데 사용되는 데이터 구조에 대해 설명합니다.

learn.microsoft.com

 

 

제공되는 컬럼중 total_pages와 used_pages를 확인하여 계산하면 되는데 1페이지당 8KBytes의 용량을 가지고 있으므로 

각 페이지에 8을 곱하여 계산하면 간단하다.

테이블 식별자는 많이 사용되는 object_id가 아닌 partition_id를 사용하기때문에 테이블명을 알아내기 위해서는 partitions뷰와 조인을 하여 확인한다.

 

SELECT DISTINCT
    object_name(p.object_id) as 'TableName'
FROM sys.allocation_units U
INNER JOIN sys.partitions P on U.container_id = P.partition_id

 

식별자를 object_id가 아닌 partition_id를 제공하는 이유는 MSSQL에서 관리하는 페이지는 모두 동일한 종류의 페이지가 아닌 데이터, 인덱스, LOB(대형 객체 VARCHAR(MAX) 등) 등을 나누어서 관리하기때문.

 

 

아래와 같이 간단하게(?) 테이블이 차지하는 용량을 확인할 수 있다.

SELECT
    object_name(p.object_id)                                    as 'TableName',
    CAST(ROUND(sum(total_pages*8) / 1024.00, 0) as INT)         as 'TOTAL MB',
    CAST(ROUND(sum(used_pages*8) / 1024.00, 0) as INT)          as 'USED MB',

    CAST(ROUND(sum(total_pages*8) / 1024.00, 0) as INT)
        - CAST(ROUND(sum(used_pages*8) / 1024.00, 0) as INT)    as 'UNUSED MB'
FROM sys.allocation_units U
INNER JOIN sys.partitions P on U.container_id = P.partition_id
WHERE P.Object_id = object_id('조회 할 테이블 이름!')
GROUP BY p.object_id