SQL Server - 数据库大小计算差异问题

时间:2008-12-08 15:13:53

标签: sql-server

我正在尝试以编程方式监视SQL Server数据库的大小,以便我的Web应用程序的管理部分可以报告它,我可以使用它来执行一些清理SP,清除日志文件等。

根据SO推荐,我使用以下代码计算表的大小:

CREATE TABLE #t (name SYSNAME, rows CHAR(11), reserved VARCHAR(18), data VARCHAR(18), index_size VARCHAR(18), unused VARCHAR(18))EXEC sp_msforeachtable 'INSERT INTO #t EXEC sp_spaceused ''?'''-- SELECT * FROM #t ORDER BY name-- SELECT name, CONVERT(INT, SUBSTRING(data, 1, LEN(data)-3)) FROM #t ORDER BY nameSELECT SUM(CONVERT(INT, SUBSTRING(data, 1, LEN(data)-3))) FROM
#tDROP TABLE #t

当我在我的小样本数据库上运行时,我得到的总和值为~6.8兆字节。当我查看数据库的属性时,它显示15.5兆字节。

我有以下问题:
1.还有什么可以弥补差异?
2.这种差异是否可以被描述为“开销”,随着其他数据的增长,这种差异只会增加一小部分(粗略估计就是我需要的)。 3.存储过程,函数,视图,触发器是否在这个“开销”空间?有没有办法计算这些?
4.有没有其他方法来获得WHOLE数据库大小?我真的只想要一个简单的方法来获得REAL大小。

3 个答案:

答案 0 :(得分:3)

在我看来,差异是由于您在“属性”页面中看到的大小是通过查询表.sys.database_files来计算的,该表计算每个数据库文件分配的8KB页面的数量。

要获得相同的结果,只需运行以下查询(SQL Server 2005):

SELECT
  SUM([size] * 8) / 1024  AS DB_Size -- Field "size" contains the number of 8 KB pages contained in each file
FROM
  [db_name_here].sys.database_files

有关MSDN网站上sys.database_files的更多信息。

希望这会有所帮助。 :)

答案 1 :(得分:1)

为什么不检查磁盘上文件(或文件)的大小?假设您知道文件的名称,您可以通过文件系统检查它们的大小。

答案 2 :(得分:0)

只是快速观察一下,您的脚本似乎只是汇总sp_spaceused的数据列而不是保留列(Reserved = data + index + unused)。 sp_msforeachtable也不包括系统表。

同样来自SQL Server Books for online for sp_spaceused

  

如果未指定objname,则为结果   返回整个数据库。

同样来自同行的书籍

  

database_size总是会更大   比保留+未分配的总和   空间,因为它包括的大小   日志文件,但保留和   unallocated_space仅考虑数据   页。

另外,您可能需要运行DBCC UPDATEUSAGE才能获得准确的数据。

另请参阅“SQL Server Books Online sp_spaceused (Transact-SQL)"