sys.master_files 和 sys.dm_io_virtual_file_stats 中的数据库文件大小不同

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(因为它显示的是原始数据库中的文件的属性,而不是快照文件。所以-文档中有错误吗?)。

Jon*_*gel 7

仅从我本地开发实例上的查询结果来看,我看到了两个不同之处(可能还有更多):

  1. sys.master_files返回文件的“虚拟”大小,同时sys.dm_io_virtual_file_stats返回文件的磁盘大小。我只看到不同大小的数据库快照,它们在后台使用 NTFS 稀疏文件(我确实验证了 Windows 中的分配和磁盘大小)。

  2. sys.dm_io_virtual_file_stats不会返回脱机数据库的大小,而sys.master_files会。

对于tempdbsys.master_files包含 的启动文件大小tempdb。如果您sys.database_files在 的上下文中进行调查tempdb,您将看到当前的大小。