2017-01-31 10 views
2

テーブルからインデックスを削除すると、SQL Serverエンジン側ではどうなりますか?ノンクラスタード・インデックスを削除するとどうなりますか?

詳細:私は実稼働環境で動作するデータベースを持っています。

このデータベースでは、定期的にデッドロックを作成するクエリがあります。私はデッドロックを作成するクエリを見つけた、私のコンピュータ上でそれを実行し、その実行計画を示しています。 SQL Server Management Studioでは、特定のテーブルにインデックスを追加することを提案しています。

私のインデックスは意味をなさないが、私の問題は、このテーブルではすでに3つのインデックスがあり、正当に使用されているかどうか、または特定の役割。

テーブルにインデックスをもう1つ追加するだけで済みますが、テーブルにデータを追加/更新/削除するたびに支払うコストについては心配です。

自分のマシンでいくつか試行しましたが、今日作成しているインデックスをエンジンが選択するために、少なくとも2つの他のインデックスを削除する必要があるようです。エンジンを強制的にインデックスに追加すると(他のすべてを削除したため)、クエリは10倍高速に実行されます。

私は単純にDROP Indexコマンドを大きな問題なく使用できますか?私は何かを再構築する必要はありませんか?

+0

無駄なインデックスを削除することはできますが、[SQL Serverに特定のインデックスを使用させる]クエリヒントを追加することもできます(https://blog.sqlauthority.com/2009/02/08/sql-server-introductionインデックスへのヒント - ヒント - パート2 /) –

+1

この最近の[@TrumpDBA](https://twitter.com/TrumpDBA/status/826154547299151872)のツイート –

答えて

6

非クラスタ化インデックスは、セカンダリデータ構造です。クラスタ化インデックスまたはヒープのメインデータ構造には統合されていません。

このように、すべてのシステムが行う必要があるのは、インデックスに関するメタデータを削除し、インデックスのページを未割り当てとしてマークする必要があるため、削除するのは比較的高速で苦労しないことです。

「再構築」する必要はありません。

1

あなたはそれらのいずれかが使用されていない場合は、

SELECT TOP 50 
    o.name AS ObjectName 
, i.name AS IndexName 
, i.index_id AS IndexID 
, dm_ius.user_seeks AS UserSeek 
, dm_ius.user_scans AS UserScans 
, dm_ius.user_lookups AS UserLookups 
, dm_ius.user_updates AS UserUpdates 
, p.TableRows 
, 'DROP INDEX ' + QUOTENAME(i.name) 
+ ' ON ' + QUOTENAME(s.name) + '.' 
+ QUOTENAME(OBJECT_NAME(dm_ius.OBJECT_ID)) AS 'drop statement' 
FROM sys.dm_db_index_usage_stats dm_ius 
INNER JOIN sys.indexes i ON i.index_id = dm_ius.index_id 
AND dm_ius.OBJECT_ID = i.OBJECT_ID 
INNER JOIN sys.objects o ON dm_ius.OBJECT_ID = o.OBJECT_ID 
INNER JOIN sys.schemas s ON o.schema_id = s.schema_id 
INNER JOIN (SELECT SUM(p.rows) TableRows, p.index_id, p.OBJECT_ID 
FROM sys.partitions p GROUP BY p.index_id, p.OBJECT_ID) p 
ON p.index_id = dm_ius.index_id AND dm_ius.OBJECT_ID = p.OBJECT_ID 
WHERE OBJECTPROPERTY(dm_ius.OBJECT_ID,'IsUserTable') = 1 and o.name='your_table_name' 
AND dm_ius.database_id = DB_ID() 
AND i.type_desc = 'nonclustered' 
AND i.is_primary_key = 0 
AND i.is_unique_constraint = 0 
ORDER BY (dm_ius.user_seeks + dm_ius.user_scans + dm_ius.user_lookups) ASC 
GO 

テーブルのインデックスが使用されているか否かがDROP INDEX文で行く知って取得するには、このクエリを実行することができます。 削除する前に、サーバーが十分に長時間UPされていることを確認し、インデックスが使用されるようにしてください。

また、テーブルに3つのインデックスを持つことはあまりありません。それらがあなたの質問に役立つかどうかだけをチェックしてください。

+0

非常にありがとう便利なクエリ! –

関連する問題