web-dev-qa-db-ja.com

インデックスを無効化または削除する方法

ライブサーバー(SQL Server 2008 R2)に非クラスター化インデックスを作成しましたが、期待していたパフォーマンス上の利点が得られないことがわかりました。インデックスをもう一度削除したいと思います。

残念ながら、使用中のため、インデックスをロックできません。それはおそらく常に使用されます。 SQL Serverの再起動は実際にはオプションではありません。

インデックスを再構築したいときにも、これと同じ問題がありました。代わりに再編成することで問題を回避する必要がありました(これは非常に非効率的な場合があります)。

SQL Serverにインデックスの使用を停止するように指示する方法はありますか?または、インデックスの排他ロックを取得しようとするクエリを実行し、無期限に待機してからインデックスを削除することは可能ですか?他のオプションはありますか?または、何らかの停止が発生するまで待ってから、すべてがオンラインに戻る前に削除することを忘れないでください。

5
paulH

インデックスの使用を停止するようSQLに指示する方法はありますか?

それはインデックスを無効にするでしょう:

alter index IX_YourIndex
on dbo.YourTable
disable;
go

しかし、それも、トランザクション性の高いオブジェクトで同時実行の問題が発生します。上記の操作にはスキーマ変更(Sch-M)ロックが必要なためですオブジェクトに対して。

または、インデックスの排他ロックを取得しようとするクエリを実行し、無期限に待機してからインデックスを削除することは可能ですか?

これがSQL Serverのデフォルトの動作です。唯一の「コマンドタイムアウト」は、クライアント側のソフトウェアによって実行されます。私はあなたが何らかのGUIを使用してインデックスを削除/無効化しようとしていると想定します(SSMSは多分?)。どちらの方法でも、これを新しいクエリウィンドウ(SSMS)に配置すると、ロックされたリソースが利用可能になるまで無期限に待機するため、必要なロックを付与できます。

drop index IX_YourIndex
on dbo.YourTable;
go

これが、遅い時間やメンテナンスウィンドウでこれらのタイプの操作を行うことがほとんどの場合最も簡単である理由の1つです。通常、これによりユーザーアクティビティがほとんどまたはまったく保証されず、これらの単純なタスクが簡単かつ迅速になります。

そして、あなたのドロップインデックスリクエストが何を/誰が待っているのかを見たい場合は、次のようなクエリを実行できます:

select
    session_id,
    command,
    wait_type,
    wait_time,
    blocking_session_id,
    wait_resource
from sys.dm_exec_requests
where command = 'drop index';
8
Thomas Stringer