본문 바로가기
TechNical/MS SQL

모든 테이블 사이즈 조사해 보자!!

by 강멍멍이 2008. 1. 21.
반응형

흠... 이번에 보여주는 T-SQL은 DB내의 모든 테이블에 대한 사이즈를 수집하는 것이다.
만든지 한... 3개월이 지나서 기억이 가물가물 하긴 한데...
모든 테이블의 인덱스 사이즈를 조사해야 할 일이 생겨서 만든거 같다.
그 많은 테이블을 sp_spaceused 를 이용해서 하나씩 하나씩 뒤지다가는 키보드를 부셔 버릴 듯 해서..;;
임시 테이블을 하나 만들어서 sp_spaceused 프로시져를 자료를 수집한다.
그리고 마지막에 임시 테이블을 쿼리해서 내용을 확인하면 끝!

-- 모든 테이블 사이즈 조사하면 다나와!!
-- 테이블 소유자까지 가져 와서 sp를 돌리므로 모든 테이블에 대한 정보를 수집한다.
-- 인덱스가 큰 놈들을 찾아 내자!
-- 인덱스가 큰 놈들을 DBCC REINDEX 명령으로 한번 돌려 주면 사이즈가 줄어 들 수도 있다.
--     2007.11.01 By Kei

-- select * from sysobjects where xtype='U'
-- exec sp_spaceused 'user_table'
-- select * into #tb_used from sysobjects where 1=2
-- select * from #tb_used

IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE name like '%#tb_used%')
drop table #tb_used

create table #tb_used(
name varchar(50),
rows int,
reserved varchar(35),
data varchar(35),
index_size varchar(35),
unused varchar(35))

declare @cmd varchar(150)
DECLARE AllTables CURSOR FOR

select sysusers.name,sysobjects.name from sysobjects
inner join sysusers
ON
sysobjects.uid = sysusers.uid
where xtype='U'
order by sysobjects.name

OPEN AllTables
DECLARE @OWNER nvarchar(128),@TBN nvarchar(128)
FETCH NEXT FROM AllTables INTO @OWNER,@TBN

WHILE (@@FETCH_STATUS = 0)

BEGIN  
 set @cmd = 'exec  sp_spaceused ' + '''' + @OWNER + '.' + @TBN+ ''''
 insert into #tb_used EXECUTE(@cmd)
 FETCH NEXT FROM AllTables INTO @OWNER,@TBN
END

CLOSE AllTables
DEALLOCATE AllTables  

select name,convert(int,replace(index_size,' KB','')) as index_size from #tb_used
order by index_size desc

-- 카운트를 확인해 보는 쎈스
-- select count(*) from #tb_used
-- select count(*) from sysobjects where xtype='U'

반응형

댓글