今天有個需求,要找出某個DB中的所有Table所占大小與列數,如果只查一個資料表,可以使用 sp_spaceused 這個指令去做。
出來的結果會是這樣
但是查一個Table還好,查很多table就很麻煩了。這時候如果用這個神奇的sp_msforeachtable來做,是可以把所有Table都列出來。
但是因為是用 foreach 去做的,所以等於是跑了 sp_spaceused 很多次,沒辦法把資料整理在同一個表內,於是查詢了一下,有人寫了一個Script可以將所需資訊整理到 temp talbe 內,相當的方便,語法如下。
這個語法就可以很整齊地整理出所有Table的Rows,Sizes等資料。
參考資料 : How do I run sp_spaceused for all tables in a database?
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