如何按表计算磁盘 I/O

Vla*_*sky 4 dmv sql-server-2012

如果所有表都在同一个文件中,是否可以找出哪些表对读/写操作的贡献最大?

我一直在看以下 DMV

SELECT *
FROM sys.dm_io_virtual_file_stats
Run Code Online (Sandbox Code Playgroud)

但它只显示整个文件的统计信息,不知道如何拆分成单个表。尝试这样做是为了识别应该放在不同磁盘上自己文件中的表。

Jam*_*son 5

以下两个查询给出了每个表的索引使用统计信息,这应该是哪些表导致最多 IO 操作的一个很好的指标。

SELECT d.name as [Database],  OBJECT_NAME(S.[OBJECT_ID]) AS [OBJECT NAME],          
I.[NAME] AS [INDEX NAME],          
USER_SEEKS,          
USER_SCANS,          
USER_LOOKUPS,          
USER_UPDATES 
FROM     SYS.DM_DB_INDEX_USAGE_STATS AS S          
INNER JOIN SYS.INDEXES AS I ON I.[OBJECT_ID] = S.[OBJECT_ID]               
AND I.INDEX_ID = S.INDEX_ID 
Join sys.Databases d on s.database_id = d.database_id
WHERE    OBJECTPROPERTY(S.[OBJECT_ID],'IsUserTable') = 1 
Order by USER_SEEKS + USER_SCANS + USER_LOOKUPS + USER_UPDATES desc


SELECT d.name, t.name, OBJECT_NAME(A.[OBJECT_ID]) AS [OBJECT NAME],       
 I.[NAME] AS [INDEX NAME],       
  A.LEAF_INSERT_COUNT,        
  A.LEAF_UPDATE_COUNT,        
  A.LEAF_DELETE_COUNT

FROM   SYS.DM_DB_INDEX_OPERATIONAL_STATS (NULL,NULL,NULL,NULL ) A        
INNER JOIN SYS.INDEXES AS I          ON I.[OBJECT_ID] = A.[OBJECT_ID]   
join sys.tables t on i.object_id = t.object_id      
join sys.databases d on a.database_id = d.database_id
AND I.INDEX_ID = A.INDEX_ID WHERE  OBJECTPROPERTY(A.[OBJECT_ID],'IsUserTable') = 1

order by A.LEAF_INSERT_COUNT + A.LEAF_UPDATE_COUNT + A.LEAF_DELETE_COUNT desc
Run Code Online (Sandbox Code Playgroud)

  • 我会小心大写目录视图和 DMV ......在区分大小写的系统上,这些查询可能会中断。另外我认为 objectproperty 检查是多余的,因为 sys.tables 不会包含任何非用户表。 (2认同)