create nonclustered index Example
On dbo.Orders(OrderID,CustomerID)
Include(StatusID)
このインデックスを次のように読みます。 Orders テーブルから OrderID、CustomerID、StatusID のシステム管理コピーを作成します。このコピーを OrderID で注文し、CustomerID との関係を断ち切ります。
select CustomerID from Orders where OrderID = 100
インデックスは OrderID によって並べ替えられるため、最初の適格なレコードをすばやく見つけることができます。最初のレコードが見つかったら、OrderID が 100 ではないレコードが見つかるまでインデックスの読み取りを続けます。その後、停止できます。必要な列はすべてインデックスにあるため、実際のテーブルを参照する必要はありません。すごい!
select OrderID from Orders where CustomerID = 20
インデックスは OrderID 順、次に CustomerID 順に並べられるため、条件を満たすレコードはインデックスのどこにでも表示される可能性があります。最初のレコードが該当する可能性があります (OrderID = 1、CustomerID = 20)。最後のレコードが該当する場合があります (OrderID = 1000000000、CustomerID = 20)。適格なレコードを見つけるには、索引全体を読み取る必要があります。これは悪いです。 マイナーなヘルプ: 必要なすべての列がインデックスにあるため、実際のテーブルを参照する必要はありません。したがって、技術的には、2 番目のクエリはインデックスによって支援されますが、他のクエリが支援されるほどではありません。
select OrderID, StatusID from Orders where CustomerID = 100 and OrderID = 1000
インデックスは OrderID、次に CustomerID の順に並べられるため、最初の適格なレコードをすばやく見つけることができます。最初のレコードが見つかったら、不適格なレコードが見つかるまでインデックスを読み続けることができます。それならやめましょう。必要な列はすべてインデックスにあるため、実際のテーブルを参照する必要はありません。すごい!
複合インデックスは、複合内の項目の 1 つを使用するクエリを改善しますか?
時々!
それとも、クエリ 1 と 2 を満たすために、それらの列 (つまり、OrderID、CustomerID) だけに個別のインデックスを作成する必要がありますか?
時々そうではありません!
本当の答えは、インデックス宣言内の列の順序がインデックス内のレコードの順序を決定するという事実によって微妙に異なります。いくつかの順序付けによって役立つクエリもあれば、そうでないクエリもあります。CustomerID、OrderID のケースをカバーするために、現在のインデックスをもう 1 つ追加する必要がある場合があります。
「必要なすべての列がインデックスにあるため、実際のテーブルを検索する必要はありません」-つまり、インデックスは読み取り目的で使用できますが、シーク/検索目的では使用できませんか?
インデックス (テーブルの一部のコピー) にクエリの解決に必要なすべての情報が含まれている場合、実際のテーブルを読み取る必要はありません。インデックスはクエリを「カバー」します。