English 中文(简体)
SQL Server - 数据库大小计算差异问题
原标题:
  • 时间:2008-12-08 15:13:52
  •  标签:

我正在尝试通过编程来监控SQL Server数据库的大小,以便我的Web应用程序的管理员部分可以报告它,并且我可以使用它来执行一些清理存储过程,以清除日志文件等。

我使用以下代码来计算表格的大小,以符合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兆字节。

I have the following questions:
1. What else can make up the difference?
2. Can this difference be described as "overhead", which will only grow at a fraction of the pace as other data grows (rough estimate is all I need for this).
3. Stored Procedures, Functions, Views, Triggers are in this "overhead" space? Is there a way to calculate these?
4. Is there another way to get the WHOLE database size? I really just want a simple way to get the REAL size.

最佳回答

在我看来,这种差异是由于所看到的尺寸在“属性”页面中是通过查询表.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 的更多信息。

希望这有所帮助。 :)

迭戈

问题回答

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

只是一个快速的观察,您的脚本似乎只计算 sp_spaceused 数据列的总和,而不是保留列 (Reserved = 数据+索引+未使用)。此外,sp_msforeachtable 不包括系统表。

此外,从 SQL Server Books online 获得 sp_spaceused 的信息。

If objname is not specified, results are returned for the whole database.

也来自在线书库的同一页。

database_size will always be larger than the sum of reserved + unallocated space because it includes the size of log files, but reserved and unallocated_space consider only data pages.

还有一件事情,您可能需要运行DBCC UPDATEUSAGE来获取准确的数据。

另请参见“SQL Server Books Online sp_spaceused(Transact-SQL)”。





相关问题
热门标签