web-dev-qa-db-ja.com

テーブルごとにディスクI / Oを把握する方法

すべてのテーブルが同じファイル内にある場合、読み取り/書き込み操作に最も貢献しているテーブルを特定することは可能ですか?

私は次のDMVを見ていました

SELECT *
FROM sys.dm_io_virtual_file_stats

ただし、ファイル全体の統計のみが表示され、個々のテーブルに分割する方法はわかりません。別のディスク上の独自のファイルに配置する必要があるテーブルを特定するために、これを試みます。

4

次の2つのクエリは、テーブルごとのインデックス使用状況統計を提供します。これは、どのテーブルが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
5
James Anderson

特定のテーブルのI/Oを通知する直接DMVはありません。私は主に sys.dm_exec_query_stats DMVを使用します。これは、高い物理的および論理的読み取りを行っているqueryに関する有用な情報を持っています。クエリを見ると、クエリに複数のテーブルがある場合、関連するテーブルを確認できますが、正確な情報は得られませんが、すべてのテーブルがほとんどのI/Oリクエストを生成していることがわかります。

SELECT TOP 25 
QS.EXECUTION_COUNT AS [EXECUTION_COUNT]      
,QS.TOTAL_WORKER_TIME AS [CPU UTILIZATION]     
,QS.TOTAL_ELAPSED_TIME AS [ELAPSED_TIME]      
,QS.TOTAL_LOGICAL_READS AS [LOGICAL_READS]      
,QS.TOTAL_LOGICAL_WRITES AS [LOGICAL_WRITES]      
,QS.TOTAL_PHYSICAL_READS AS [PHYSICAL_READS]
,ST.TEXT
FROM SYS.DM_EXEC_QUERY_STATS QS         
CROSS APPLY SYS.DM_EXEC_SQL_TEXT(QS.SQL_HANDLE) ST
ORDER BY QS.TOTAL_PHYSICAL_READS DESC;

お役に立てれば

0
Shanky