すべてのテーブルが同じファイル内にある場合、読み取り/書き込み操作に最も貢献しているテーブルを特定することは可能ですか?
私は次のDMVを見ていました
SELECT *
FROM sys.dm_io_virtual_file_stats
ただし、ファイル全体の統計のみが表示され、個々のテーブルに分割する方法はわかりません。別のディスク上の独自のファイルに配置する必要があるテーブルを特定するために、これを試みます。
次の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
特定のテーブルの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;
お役に立てれば