私はSQL Server 2012を使用しており、データベースに10行のテーブルがあり、通常はSQLサーバープロファイラーにクエリがありません。しかし、dm_db_index_usage_stats
インデックスの使用状況を調査するために使用すると、このテーブルの主キー インデックスは高くuser_update
、user_seek
.
このインデックスの更新とシークが高い理由がわかりません。
この未使用のテーブルの平均更新は、1 分あたり約 1000 回です。
編集
このテーブルには、別のテーブルとの外部キーがなく、依存関係がありません。
この問題は、SQL サーバーのバグだったと思います。
編集2
このテーブルを削除して再作成し、データを再度挿入しても、このテーブルのインデックスの使用は変わりませんでした。
おそらく、このテーブルのようなテーブルがいくつか存在すると思います(使用せず、インデックスの更新とインデックスのシークがあります)。
編集3
このテーブルに after update トリガーを記述し、更新されたレコードを別のテーブルに保存します( JohnLBevan suggest
)が、新しいテーブルにはレコードを挿入しません。つまり、このトリガーは実行されません。しかし、インデックス user_seek とインデックス user_update はまだ変更されています。私は、この問題が SQL Server のバグであると固く信じています。しかし、これらの更新とシークがパフォーマンスに効果があるかどうかはわかりません。
編集 4
以下のコードを使用して、インデックスの使用状況を取得します。
SELECT *
From
(SELECT DB_NAME(ddius.database_id)AS DatabaseName, OBJECT_NAME(ddius.object_id) AS object_name ,
CASE
WHEN ( SUM(user_updates + user_seeks + user_scans + user_lookups) = 0 )
THEN NULL
ELSE ( CAST(SUM(user_seeks + user_scans + user_lookups) AS DECIMAL)
/ CAST(SUM(user_updates + user_seeks + user_scans
+ user_lookups) AS DECIMAL) )
END AS RatioOfReads ,
CASE
WHEN ( SUM(user_updates + user_seeks + user_scans + user_lookups) = 0 )
THEN NULL
ELSE ( CAST(SUM(user_updates) AS DECIMAL)
/ CAST(SUM(user_updates + user_seeks + user_scans
+ user_lookups) AS DECIMAL) )
END AS RatioOfWrites ,
SUM(user_updates + user_seeks + user_scans + user_lookups)
AS TotalReadOperations ,
SUM(user_updates) AS TotalWriteOperations
FROM sys.dm_db_index_usage_stats AS ddius
JOIN sys.indexes AS i ON ddius.object_id = i.object_id
AND ddius.index_id = i.index_id
WHERE i.type_desc IN ( 'CLUSTERED', 'HEAP' ) --only works in Current db
GROUP BY ddius.database_id,ddius.object_id) Z
ORDER BY TotalWriteOperations desc --OBJECT_NAME(ddius.object_id)