web-dev-qa-db-ja.com

不足しているインデックスの詳細SQL

私はSQLサーバーをチューニングしており、クエリの1つに対する実行プランを上部に表示すると、次のようになります。

「インデックスがありません(影響99.7782):非クラスター化インデックスを作成...」

だから私は不足しているインデックスの詳細を見て、それはこれを示しています:

/*
Missing Index Details from ExecutionPlan1.sqlplan
The Query Processor estimates that implementing the following index could improve the query cost by 99.7782%.
*/

/*
USE [phsprod]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[address] ([userid])

GO
*/

私は約1か月間SQLを使用しており、すべてのテーブルが既に作成されているため、これを使用して何もしていません。誰もがこれをどうするかについてのアイデアを私に説明/与えるのを手伝ってくれる?ありがとう。

22
Matt P

つまり、SQL Serverは、インデックスを使用するとクエリをより高速に実行できることを示唆しています。インデックスはオーバーヘッドとディスクストレージを追加するため、クエリが本番環境でパフォーマンスの問題を引き起こしていない限り、このヒントは無視してください。

インデックスを作成するには、useの後のステートメントのコメントを外し、[<Name of Missing Index, sysname,>]を実際の名前に置き換えて実行します。

USE [phsprod]
GO
CREATE NONCLUSTERED INDEX IX_Address_UserId
ON [dbo].[address] ([userid])
25
Andomar

つまり、SQL Serverは、このインデックスを使用するとクエリをより高速に実行できることを示唆しています。

これは、現在のインデックスが、実行しているクエリに対して最大ではないことを意味している可能性があります。クエリが最適化されている可能性があります。または、インデックスを追加することもできます。ただし、これを行う場合は、慎重に分析する必要があります。

実際、インデックスはオーバーヘッドとディスクストレージを追加します。ただし、パフォーマンスも向上します。たとえば、常に「ユーザーID」に基づいてテーブルを検索する場合、SQLはこのインデックスを使用して検索できるため、その列にインデックスを追加することで利益を得ることができます。

辞書で単語を検索する場合は、このように少し考えてください。 「dog」という単語を探している場合、「d」を検索してから「do」で始まる単語を検索して、最終的に「dog」という単語を見つけます。

単語が辞書でアルファベット順に並んでいない場合、辞書全体を検索して「犬」という単語を見つける必要があります。

クラスター化インデックス(または主キー)は、列の順序です。現在、「userid」列にインデックスがないようです。したがって、SQL Serverは(おそらく)テーブル全体をスキャンして、ユーザーIDを見つける必要があります。

非クラスター化インデックスを追加した場合、テーブルの順序は変更されませんが、必要なユーザーIDを見つけるために検索する範囲をSQL Serverに指示します。 (「辞書の20〜30ページ」のように)テーブル全体を検索して見つける必要はありません。

ただし、テーブルに新しいデータを追加したり、削除または変更したりするときに、インデックスを最新の状態に保つ必要があることも意味します。一般的に、いくつかのインデックスは問題ありませんが、それらが必要であることを確認する必要があります。インデックスを追加しすぎるとパフォーマンスが低下する可能性があるため、インデックスを追加しすぎないようにしてください。

また、テーブルに数百行しか含まれていない場合、パフォーマンスが大幅に向上することはないでしょう。しかし、時間の経過とともに、テーブルが大きくなると、違いが生じる可能性があります。

お役に立てば幸いです。