흠... 이번에 보여주는 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
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'
댓글