Jān*_*nis 7 sql-server-2005 sql-server-2008 sql-server-2008-r2
我使用查询来找出数据库文件的大小。我正在使用系统视图和 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)
Run Code Online (Sandbox Code Playgroud)
我很困惑 - 将两个值都转换为“字节”,然后比较它们。但是在我检查的所有实例中,temdb 文件大小(来自 sys.master_files)都小于磁盘上的文件大小(来自 sys.dm_io_virtual_file_stats)。
在所有其他情况下,如果存在差异,那么这是正确的(磁盘上的大小实际上小于文件大小 - 因为它们是稀疏文件)。
这种差异的原因是什么?
更新:当我查询时
Select is_sparse, * From sys.database_files
Run Code Online (Sandbox Code Playgroud)
在 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
,您将看到当前的大小。