25

私は SQL サーバーを調整しており、クエリの 1 つの実行計画を一番上に表示すると、次のように表示されます。

「インデックスがありません (影響 99.7782): CREATE NONCLUSTERED INDEX...」

そこで、欠落しているインデックスの詳細を調べたところ、次のように表示されました。

/*
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
*/

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

4

2 に答える 2

27

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

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

USE [phsprod]
GO
CREATE NONCLUSTERED INDEX IX_Address_UserId
ON [dbo].[address] ([userid])
于 2012-09-14T12:34:24.953 に答える
18

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

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

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

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

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

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

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

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

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

それが役立つことを願っています!

于 2012-09-14T12:42:46.213 に答える