あなたは、スペースを節約し、インデックスを使用しても性能に影響を与えていない場合。したがって、我々は、DBサーバが起動するので、インデックス情報を使ったことがない、見つけることがsys.dm_db_index_usage_statsを通過します。
では1は、情報DBを見つけることができます不足しているインデックス「不足している情報DB指数見つけるために」。
あなたはそのインデックスを使用していない場合、それはまた、パフォーマンスに影響を与えるとスペースを節約できます。
したがって、我々は、DBサーバが起動するので、インデックス情報を使ったことがない、見つけることがsys.dm_db_index_usage_statsを通過します。
user_updates介して次のように、インデックス情報に大きな影響を見つけるために20前(データテーブルは、INSERT / UPDATE / DELETE引き起こさを行う必要があり、インデックス更新の数ので)、
SELECT TOP 20
SCHEMA_NAME(o.Schema_ID) AS SchemaName
, OBJECT_NAME(s.[object_id]) AS TableName
, i.name AS IndexName
, s.user_updates
, s.system_seeks + s.system_scans + s.system_lookups
AS [System usage]
, s.system_seeks
, s.system_scans
, s.system_lookups
FROM sys.dm_db_index_usage_stats s
INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
AND s.index_id = i.index_id
INNER JOIN sys.objects o ON i.object_id = o.object_id
WHERE s.database_id = DB_ID()
AND OBJECTPROPERTY(s.[object_id], 'IsMsShipped') = 0
AND s.user_seeks = 0
AND s.user_scans = 0
AND s.user_lookups = 0
AND i.name IS NOT NULL
ORDER BY s.user_updates DESC;
これらは、あなたがもう一度DBの単語を検索したい場合は、以下のように、あなたは、sp_MSforeachdbと一時テーブルを介してすべてのインデックス情報DBを保存することができ、現在のDBクエリのためのものです
SELECT
DB_NAME() AS DatabaseName
, SCHEMA_NAME(o.Schema_ID) AS SchemaName
, OBJECT_NAME(s.[object_id]) AS TableName
, i.name AS IndexName
, s.user_updates
, s.system_seeks + s.system_scans + s.system_lookups
AS [System usage]
, s.system_seeks
, s.system_scans
, s.system_lookups
INTO #TempUnusedIndexes
FROM sys.dm_db_index_usage_stats s
INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
AND s.index_id = i.index_id
INNER JOIN sys.objects o ON i.object_id = o.object_id
WHERE 1=2
EXEC sp_MSforeachdb 'USE [?];
INSERT INTO #TempUnusedIndexes
SELECT TOP 20
DB_NAME() AS DatabaseName
, SCHEMA_NAME(o.Schema_ID) AS SchemaName
, OBJECT_NAME(s.[object_id]) AS TableName
, i.name AS IndexName
, s.user_updates
, s.system_seeks + s.system_scans + s.system_lookups
AS [System usage]
, s.system_seeks
, s.system_scans
, s.system_lookups
FROM sys.dm_db_index_usage_stats s
INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
AND s.index_id = i.index_id
INNER JOIN sys.objects o ON i.object_id = o.object_id
WHERE s.database_id = DB_ID()
AND OBJECTPROPERTY(s.[object_id], ''IsMsShipped'') = 0
AND s.user_seeks = 0
AND s.user_scans = 0
AND s.user_lookups = 0
AND i.name IS NOT NULL
ORDER BY s.user_updates DESC'
SELECT * FROM #TempUnusedIndexes ORDER BY [user_updates] DESC
DROP TABLE #TempUnusedIndexes
あなたが開始されてからDBサーバを考える場合、システムの機能のほとんどが使用され、その後、スペースを節約し、パフォーマンスを向上させる削減するために、上記のインデックスを削除または無効にすることができます見つけます。
MSDNのuser_updates以下に説明するが、
基礎となるデータ表またはビュー、更新によって挿入されたインデックスに留意、または操作メンテナンスレベルを削除する原因となります。
あなたは、インデックスを決定するために、このビューを使用することができますほとんど使用しないでくださいアプリケーションです。
また、メンテナンスの負担が発生しますどのインデックスを決定するために、このビューを使用することができます。
あなたは、頻度の低いクエリのための農産物のメンテナンスの負担をアンロードではなく、クエリのために、またはインデックス考えるかもしれません。
user_seeks - - user_scans - だから、それはuser_updatesを介して送信することができ、次のようにしても、インデックスの比較的高いコストを見つけることができ、計算user_lookupsものであり、
SELECT TOP 20
SCHEMA_NAME(o.Schema_ID) AS SchemaName
, OBJECT_NAME(s.[object_id]) AS TableName
, i.name AS IndexName
, (s.user_updates ) AS [update usage]
, (s.user_seeks + s.user_scans + s.user_lookups)
AS [Retrieval usage]
, (s.user_updates - s.user_seeks - user_scans - s.user_lookups)
AS [Maintenance cost]
, s.system_seeks + s.system_scans + s.system_lookups AS [System usage]
, s.last_user_seek
, s.last_user_scan
, s.last_user_lookup
FROM sys.dm_db_index_usage_stats s
INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
AND s.index_id = i.index_id
INNER JOIN sys.objects o ON i.object_id = o.object_id
WHERE s.database_id = DB_ID()
AND i.name IS NOT NULL
AND OBJECTPROPERTY(s.[object_id], 'IsMsShipped') = 0
AND (s.user_seeks + s.user_scans + s.user_lookups) > 0
ORDER BY [Maintenance cost] DESC
リファレンス情報
アクション内のSQL ServerのDMV
sys.dm_db_index_usage_stats
SQL Serverの:sp_MSforeachDBにフィルタの適用
オリジナル:大列 情報が使用されていないインデックスまたはDBの高コストを見つけるために[SQL]