我使用查询来找出数据库文件的大小。我正在使用系统视图和 DMV,因为我确实想找出实际文件大小和理论(在稀疏文件的情况下)文件大小。
Select
DB_NAME(mf.database_id) AS [Database Name],
mf.Name,
mf.physical_name PhysicalName,
cast(mf.size as bigint) * 8192 mfSize_bytes,
fs.size_on_disk_bytes fsSize_bytes
From sys.master_files mf
Left Join sys.dm_io_virtual_file_stats(DEFAULT, DEFAULT) fs
On mf.database_id = fs.database_id and mf.file_id = fs.file_id
Order By DB_NAME(mf.database_id)
我很困惑-将两个值都转换为“字节”,然后进行比较。但在所有情况下,我检查了 - temdb 文件大小(来自 sys.master_files)小于磁盘上的文件大小(来自 sys.dm_io_virtual_file_stats)。
在所有其他情况下,如果存在差异,那是正确的(磁盘上的大小实际上小于文件大小 - 因为它们是稀疏文件)。
造成这种差异的原因是什么?
更新:当我查询时
Select is_sparse, * From sys.database_files
在 SQL Server 2005 数据库快照上,列 is_sparse = 0 (因为它显示的是来自原始数据库的文件的属性,而不是快照文件。那么文档中是否存在错误?)。
仅通过查看本地开发实例上的查询结果,我看到了两个不同之处(可能还有更多):
sys.master_files
返回文件的“虚拟”大小,同时sys.dm_io_virtual_file_stats
返回文件的磁盘大小。我只看到数据库快照的大小不同,它们在后台使用 NTFS 稀疏文件(我确实在 Windows 中验证了分配的大小和磁盘大小)。sys.dm_io_virtual_file_stats
不返回离线数据库的大小,而返回sys.master_files
。对于 的情况
tempdb
,sys.master_files
包含 的启动文件大小tempdb
。如果您sys.database_files
在 的上下文中进行调查tempdb
,您将看到当前大小。