日期:2014-05-18  浏览次数:20582 次

怎么查看各表占用的包括 lob 的实际空间,有没有这样的sql语句
select OBJECT_NAME(ID)
  ,SIZE = sum(reserved) * CONVERT(FLOAT, (SELECT LOW FROM MASTER.DBO.SPT_VALUES WHERE NUMBER = 1 AND TYPE = 'E')) /1024.00/1024.00
  --表大小(字节)= 8192 x Num_Pages (M)
  from sysindexes
  where indid in (0,1,255)
  GROUP BY ID
  ORDER BY SIZE DESC


各个表都占用的空间不大,但是整个数据库有4g之大,我想知道怎么查询出实际占用的空间,有没有办法。


百分百结贴



------解决方案--------------------
sp_spaceused 表名
------解决方案--------------------
sp_spaceused 
显示行数、保留的磁盘空间以及当前数据库中的表所使用的磁盘空间,或显示由整个数据库保留和使用的磁盘空间。 

示例 
A. 有关表的空间信息 
下例报告为 titles 表分配(保留)的空间量、数据使用的空间量、索引使用的空间量以及由数据库对象保留的未用空间量。 

USE pubs 
EXEC sp_spaceused 'titles ' 

B. 有关整个数据库的已更新空间信息 
下例概括当前数据库使用的空间并使用可选参数 @updateusage。

USE pubs 
sp_spaceused @updateusage = 'TRUE '
------解决方案--------------------
sp_spaceuser 表名
------解决方案--------------------
SQL code

declare @a varchar(100)
declare csr_tbname cursor for select [name] from sys.objects where type='U'

open csr_tbname 
fetch next from csr_tbname into @a;
while @@FETCH_STATUS=0
begin
    exec sp_spaceused @a;
    fetch next from csr_tbname into @a;
end

close csr_tbname;
deallocate csr_tbname;

-- 这样查出来的总和也不会等于数据库的大小,我试过,并且差距很大。
-- sp_helpdb

------解决方案--------------------
2005后,用这个存储过程看看。
SQL code

USE MASTER 
GO 
IF OBJECT_ID('sp_tableinfo') IS NOT NULL DROP PROC sp_tableinfo 
GO 
CREATE PROCEDURE sp_tableinfo 
@tblPat SYSNAME = '%' 
,@sort CHAR(1) = 'm' 
AS 
--Written by Tibor Karaszi 2010-09-30
--Modified 2010-10-10, fixed rowcount multiplied by number of indexes.
--Modified 2010-10-11, fixed rowcount incorrect with BLOB and row overflow data.
WITH t AS
(
SELECT 
SCHEMA_NAME(t.schema_id) AS schema_name
,t.name AS table_name
,SUM(CASE WHEN p.index_id IN(0,1) AND a.type_desc = 'IN_ROW_DATA' THEN p.rows ELSE 0 END) AS rows
,SUM(CAST((a.total_pages * 8.00) / 1024 AS DECIMAL(9,2))) AS MB 
,SUM(a.total_pages) AS pages 
,ds.name AS location
FROM 
sys.tables AS t
INNER JOIN sys.partitions AS p ON t.OBJECT_ID = p.OBJECT_ID
INNER JOIN sys.allocation_units AS a ON p.hobt_id = a.container_id 
INNER JOIN sys.data_spaces AS ds ON a.data_space_id = ds.data_space_id
WHERE t.name LIKE @tblPat 
GROUP BY SCHEMA_NAME(t.schema_id), t.name, ds.name 
)
SELECT schema_name, table_name, rows, MB, pages, location
FROM t
ORDER BY
CASE WHEN @sort = 'n' THEN table_name END
,CASE WHEN @sort = 'r' THEN rows END DESC
,CASE WHEN @sort = 'm' THEN MB END DESC
,CASE WHEN @sort = 's' THEN schema_name END
GO