Monday, September 19, 2011

MSSQL 查詢 Table Size

今天有個需求,要找出某個DB中的所有Table所占大小與列數,如果只查一個資料表,可以使用 sp_spaceused 這個指令去做。
exec sp_spaceused <tablename>

出來的結果會是這樣
Table_Name	Total_Rows	Total_Table_Size	Data_size	Index_Size	UnusedSpace
<tablename>	676816 		754600 KB		421120 KB	319704 KB	13776 KB

但是查一個Table還好,查很多table就很麻煩了。這時候如果用這個神奇的sp_msforeachtable來做,是可以把所有Table都列出來。
exec sp_msforeachtable 'exec sp_spaceused [?]'

但是因為是用 foreach 去做的,所以等於是跑了 sp_spaceused 很多次,沒辦法把資料整理在同一個表內,於是查詢了一下,有人寫了一個Script可以將所需資訊整理到 temp talbe 內,相當的方便,語法如下。
select 'Database Name: ', db_name()
set nocount on
if exists(select name from tempdb..sysobjects where name='##tmp')
drop table ##tmp
create table ##tmp(nam varchar(50), rows int, res varchar(15),data varchar(15),ind_sze varchar(15),unsed varchar(15))
go
declare @tblname varchar(50)
declare tblname CURSOR for select name from sysobjects where xtype='U'
open tblname
Fetch next from tblname into @tblname
WHILE @@FETCH_STATUS = 0
BEGIN
insert into ##tmp
exec sp_spaceused @tblname
  FETCH NEXT FROM tblname INTO @tblname
END
CLOSE tblname
deallocate tblname
go
select nam Table_Name,rows Total_Rows,res Total_Table_Size,data Data_size,ind_sze Index_Size,unsed Unused_Space from ##tmp order by Table_Name
drop table ##tmp

這個語法就可以很整齊地整理出所有Table的Rows,Sizes等資料。

參考資料 : How do I run sp_spaceused for all tables in a database?

No comments:

Post a Comment