SQL Serverのインデックスチューニング - 無用インデックス

私たちは、合理的なインデックスが大幅にパフォーマンスを向上するだけでなく、インデックスデータベースのパフォーマンスの冗長性を減らすことができることを知っています。私たちのビジネスの発展に伴い、表に、データベースのテーブル構造は、内容が変更される可能性が高い問い合わせます。このように、いくつかのインデックスが使用もはや、必要が削除されないことにすること(ストレージの無駄であるインデックス、そしてコストパフォーマンスを維持するため);他の人がテーブルインデックスを変更または追加する必要がありますながら。この記事では、すぐにはもはや使用されているインデックスは、動的ビュー(DMV)クエリを決定するために、1つを見つけるための主な方法を提供します。

無駄な指標
まず、無用のインデックスを照会する方法を見て。sys.dm_db_index_usage_statsが最後に再起動してから録音したり、データベースのオフラインまたは索引の統計をリセットするために使用し、最近のインデックスを使用していない最近使用落ちたインデックスを除いた指数のすべてのテーブル内のレコードのデータ、、、特定のスクリプトをsys.indexes次のように:

-データベースのインデックスがために使用されていない照会
のUSE WideWorldImporters;
GOは
DECLAREがINT =( 'WideWorldImporters')DB_IDを@dbid;
WITH CTEをASを(
SELECT
[OBJECT_ID]は、INDEX_ID
sys.indexes FROM
EXCEPT
SELECT
[OBJECT_ID]、INDEX_ID
SYSあります。 dm_db_index_usage_stats
のdatabase_id @ = DBID)
SELECTは
i.nameはINDEXNAME、tableNameのをo.name
I FROM sys.indexes
INNERがON = AND CTE CTEをi.index_id。[OBJECT_ID] = I. [OBJECT_ID] cte.index_id JOIN
INNER JOINをsys.objects 。O ON I [OBJECT_ID = O [OBJECT_ID]。
WHERE O [タイプ]に( 'U-'、 'V')とI [タイプ]> 0、..
我々は唯一のテーブルまたはユーザによって作成されたインデックス付きビューを調べるため、最後に、我々のみ選択sys.objectsタイプは「U」(ユーザーが作成したテーブル)及び「V」(ユーザが作成したインデックスを図)です。ヒープ内のsys.indexesタイプ= 0は、それも除外されます。ここでは、インデックスを削除するスクリプトを生成されます。

DECLARE @dbid INT = DB_ID( 'WideWorldImporters')。
CTE AS WITH(
SELECT
[OBJECT_ID]、INDEX_ID
sys.indexes FROM
EXCEPT
SELECT
[OBJECT_ID]、INDEX_ID
sys.dm_db_index_usage_stats FROM
のdatabase_id = @ DBID)
SELECT
修改主键索引删除报错的问题-
CASE is_primary_key = 1 THEN「ALTER TABLE '+ o.name +' DROP CONSTRAINT '+ i.name
ELSE' DROP INDEX '+ i.name +' ON「+ o.name
END
I sys.indexes FROM
INNERはCTE ON cte.index_id = i.index_id AND CTE JOIN。 【のobject_id] = iが[OBJECT_ID]
INNERは、I ON O sys.objectsをJOIN [OBJECT_ID = O。[OBJECT_ID]
WHERE O。IN( 'U'、 'V')とI。[タイプ]> [入力します] 0;

DECLARE @dbid INT = DB_ID( 'WideWorldImporters')。
VARCHAR(MAX)@sql DECLARE。
WITH CTE AS(
SELECT
[OBJECT_ID]は、INDEX_ID
sys.indexes FROM
除き
SELECT
、[OBJECT_ID] INDEX_ID
sys.dm_db_index_usage_stats FROM
WHEREのdatabase_id = @ DBID)
SELECT @ SQL =(
SELECT
-修改主键索引删除报错的问题
CASE WHEN is_primary_key = 1 THEN 'ALTER TABLE '+ o.name +' DROP CONSTRAINT' + i.name
+ o.name 'ON 'ELSE' DROP INDEX' + i.name +
END
I sys.indexes FROM
INNER JOIN CTE ON cte.index_id =私.index_id AND CTE [OBJECT_ID] = I [OBJECT_ID]
INNERは、I ON oをsys.objectsをJOIN [OBJECT_ID = O。[OBJECT_ID]
O。IN( 'U'、V 'を' [入力]
PATHのXML FOR( '')、TYPE).Valueの( ''、 'NVARCHAR(MAX。)');
--exec sp_executesqlを@sql
注意深い読者はわかります、最後のステートメント上記(EXEC sp_executesqlを@sql)がコメントアウトされています直接実行あなたはすぐにすべてのほとんど役に立たないインデックスを削除することができるように。我々は上記の言ったように、我々は最近、再起動した場合でも、最後の再起動以降sys.dm_db_index_usage_stats記録後、またはインデックスへのデータベースまたはオフライン利用状況の統計情報をリセットし、インデックスが使用され、そのレコードが(不完全な場合がありますデータベースサービス、サーバーデータベースをホストまたは動的なビューをリセット)、これはいくつかの有用な指標につながる可能性が生成されたスクリプトを直接実行することができない、覚えて、覚えて、覚えて、削除する必要があります。頻繁にデータベースがある場合は保険の練習は、少なくとも、そのようなことをやって月に実行しているデータベース・サービスで使用されるインデックスレコードがデータベースのメンテナンスの再起動前に収集することができ、既に、サービスを再起動して維持しました。数ヶ月またはレコードの年後、あなたはそれを削除し、インデックスを確定する必要はありません。
----------------
免責事項:この記事はCSDNブロガーのオリジナルの記事、CC 4.0 BY-SAの著作権協定に従うが、再現「3つの空道教」で、オリジナルのソースとのリンクを添付してくださいこの文。
オリジナルリンクします。https://blog.csdn.net/zhoujunah/article/details/85615576

おすすめ

転載: www.cnblogs.com/footleg/p/12053802.html