DataBase/MS_SQL
MS-SQL 테이블 용량 조회 쿼리 (+ 간단한 설명)
MKJo
2024. 7. 31. 15:08
MSSQL에서 테이블이 차지하는(할당된) 용량을 확인하기 위해서는 sys 스키마의 allocation_units 뷰값을 통해 확인한다.
select * from sys.allocation_units

참조
페이지 및 익스텐트 아키텍처 가이드 - 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