SQL 2015. 4. 13. 10:49

테이블 크기를 얻는 쿼리 작성

DB를 정리할 때 간단한 쿼리를 이용하여 테이블 크기와 라인수를 알아볼 수 있는 쿼리가 필요한 경우가 있다.


호환성 뷰인 sys.sysindexes, sys.sysobjects 를 이용하면 간단한데 

호환성 뷰는 지금까지 릴리즈에 사용되었던 여러 시스템 테이블을 뷰 집합으로 구현된 것이다. 메타데이터를 표시하는 시스템 뷰 컬렉션 중 하나이다.


각각의 테이블은 여러 칼럼을 포함하고 있지만 기능 구현에 필요한 간단한 칼럼만 알아보면 된다.


sys.sysindexes

- 현재 데이터 베이스 내의 각 인덱스 및 테이블마다 한 행을 포함한다.

 칼럼

형식 

설명 

 id

int 

인덱스가 속한 테이블의 ID 

 indid

smallint 

인덱스의 ID

0 = 힙

1 = 클러스터형 인덱스

>1 = 비클러스터형 인덱스

 reserved

int 

 indid = 0 또는 indid = 1인 경우 reserved는 모든 인덱스 및 테이블 데이터에 할당된 페이지 수

행 오버플로가 발생할 경우 정확한 결과가 반환되지 않는다



sys.sysobjects

- 데이터 베이스에서 만들어진 각 개체 (제약 조건, 기본값, 로그, 규칙, 저장 프로시저) 당 한 개의 행을 포함한다.

 칼럼

형식 

설명 

 name

sysname 

개체 이름 

 id 

int 

개체 ID 

 xtype

char(2) 

개체 유형 

U = 사용자 테이블

기타 등등.. 아주 많다. 



데이터 베이스가 포함한 테이블 크기 알아보기

SELECT 

CONVERT(VARCHAR(30), MIN(o.name)) AS t_name

    , LTRIM(STR(SUM(reserved) * 8192.0 / 1024.0, 15, 0) + ' KB') AS t_size

FROM   sysindexes i

INNER JOIN sysobjects o 

ON o.id = i.id

WHERE i.indid IN (0, 1)

   AND o.xtype = 'U'

GROUP BY i.id

ORDER BY SUM(reserved) * 8192.0 / 1024.0 DESC

코드에서 reserved 에 8192 를 곱한 이유는 mssql의 페이지 크기가 8KB 이기 때문이다.


데이터 베이스가 포함한 테이블 라인 수 알아보기

SELECT 

o.name

, i.rows

FROM   sysindexes i

INNER JOIN sysobjects o 

ON i.id = o.id

WHERE i.indid < 2

AND o.xtype = 'U'

ORDER BY i.rows DESC