1

我需要找到一个 sql server 2008 数据库的大小。我使用了以下存储过程

执行 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

但这让我有点困惑,因为这只给出了每张桌子的保留大小。保留大小是多少?如果我将每个数据库表的保留大小相加,它不会加起来就是数据库大小。

4

2 回答 2

2

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

于 2012-09-26T17:46:31.353 回答
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);
于 2012-09-26T17:46:12.220 回答