2012-09-26 40 views
1

我需要找到一个sql server 2008数据库的大小。我用下面的存储过程计算sql server数据库的大小

EXEC注释sp_spaceused

如果给我回了以下数据,数据库名称,数据库大小,未分配的空间,保留的数据,index_size,未使用的

有什么办法,我可以获取数据库的大小,排除某些表?

我能够使用此查询

DECLARE @LOW int 
SELECT @LOW = LOW 
FROM [master].[dbo].[spt_values] (NOLOCK) 
WHERE [number] = 1 AND [type] = 'E' 

SELECT TableName,[Row Count],[Size (KB)] FROM 
(
    SELECT QUOTENAME(USER_NAME(o.uid)) + '.' + 
       QUOTENAME(OBJECT_NAME(i.id)) 
    AS TableName 
    ,SUM(i.rowcnt) [Row Count] 
    ,CONVERT(numeric(15,2), 
     (((CONVERT(numeric(15,2),SUM(i.reserved)) * @LOW)/1024))) AS [Size (KB)] 
    FROM sysindexes i (NOLOCK) 
    INNER JOIN sysobjects o (NOLOCK) 
    ON i.id = o.id AND 
    ((o.type IN ('U', 'S')) OR o.type = 'U') 
    WHERE indid IN (0, 1, 255) 
    GROUP BY 
    QUOTENAME(USER_NAME(o.uid)) + '.' + 
    QUOTENAME(OBJECT_NAME(i.id)) 
    HAVING SUM(i.rowcnt) > 0 
) AS Z 
ORDER BY [Size (KB)] DESC 

让每个数据库表的预留尺寸但这混淆了我咯,因为这只是给每桌保留大小。什么是保留的大小?如果我总结每个数据库表的保留大小,它不会加起来到数据库大小。

回答

1

请停止使用向后兼容视图,如sysindexes/sysobjects。

像这样的东西可能会更好,但索引/表本身并不能解释数据库中的所有内容。

SELECT Size_In_MB = SUM(reserved_page_count)*8/1024.0 
    FROM sys.dm_db_partition_stats 
    WHERE OBJECT_NAME([object_id]) NOT IN (N'table1', N'table2'); 

此外,为什么你忽略非聚集索引?你认为他们对尺寸没有贡献吗?你可以在这里添加一个类似的过滤器,但我不知道你为什么会:

AND index_id IN (0,1,255); 
2

有很多不仅仅是表占用空间在数据库中。还要记住,表/数据库的大小是不断变化的。行被添加,删除,日志被创建用来跟踪所做的事情,以便它可以在必要时撤消或重做。当这个空间被使用和释放时,它通常不会被释放回文件系统,因为SQL知道它可能会再次需要它。 SQL将为它自己的未来使用释放空间,但根据数据库仍在使用空间的文件系统。