0

私はSQL Server 2012を使用しており、データベースに10行のテーブルがあり、通常はSQLサーバープロファイラーにクエリがありません。しかし、dm_db_index_usage_statsインデックスの使用状況を調査するために使用すると、このテーブルの主キー インデックスは高くuser_updateuser_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)
4

1 に答える 1

5
SELECT *
From
(SELECT  OBJECT_NAME(ddius.object_id) AS object_name , 
      ...
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.object_id) Z 
ORDER BY TotalWriteOperations desc --OBJECT_NAME(ddius.object_id)

クエリが正しくありません。sys.dm_db_index_usage_statsサーバー全体(すべてのDB)からエントリを返しますが、現在のDB object_id/に参加していますindex_id。結果は、すべての DB からのエントリを誤って集計し、それらを現在の DB での使用状況として提示しています。ddius.database_id = DB_ID()に追加WHERE:

WHERE   i.index_id <= 1 -- clustered or heap
 AND ddius.database_id = DB_ID()
于 2013-09-23T12:58:03.847 に答える