10

テーブルがあるとします:

CREATE TABLE Users (
    Id INT IDENTITY (1, 1),
    FirstName VARCHAR(40),
    LastName VARCHAR(40)
)

通常、クエリはFirstNameまたはLastNameに対して行われますが、 FirstName および LastNameに対しても行われます。

FirstNameに非クラスター化インデックスを作成し、LastNameに別の非クラスター化インデックスを作成すると、最初の 2 つのクエリが処理されます。どうやら、SQL Server は他のクエリにインデックス交差を使用するようです。

または、(FirstName) と (LastName, FirstName) にインデックスを付けている場合、SQL Server はLastNameだけのクエリと両方のクエリに 2 番目のインデックスを使用できますか?

SQL Server は、複合インデックス パーツを左から右または右から左のどちらで保存しますか? つまり、LastNameFirstName または FirstNameLastName としてキーを作成しますか? それとも、任意に選択するのは自由ですか?

4

3 に答える 3

10

SQL Serverは、LastNameだけのクエリと両方のクエリにインデックス(LastName、FirstName)を使用できますか?

はい、データベースはLastNameのクエリにインデックス(LastName、FirstName)を使用します。ただし、FirstNameのみのクエリにはこのインデックスは使用されません。

複合インデックスパーツを左から右に保存しますか、それとも右から左に保存しますか?

ストレージはBツリーにあります。右から左に保存されていると考えるか、左から右に保存されていると考えるかは、視覚化に役立つだけであり、実際のデータストレージとは関係ありません。

于 2010-02-09T10:14:19.017 に答える
1

はい、LastNameのみでクエリを実行する場合は、(LastName、FirstName)インデックスを使用する必要があります。したがって、LastNameのみでクエリを実行する場合、またはLastNameとFirstNameを一緒にクエリする場合の両方で使用されます。

一般的なガイドラインは、選択性が最も高いカラムが化合物インデックスの最初に表示されるようにすることです。これにより、次の選択性の低いカラムの前に、結果セットが最も効果的/絞り込まれます。

于 2010-02-09T10:14:37.783 に答える
1

送信する実際のクエリによっては、2 番目の列のみを検索する場合でも、2 つの列の複合インデックスが使用される場合があります。ただし、インデックス シークは得られませんが、ほとんどの場合、インデックス スキャンが行われます。これが「十分」であるかどうかは、特定の環境によって異なります。インデックス作成は科学というより芸術であり、多くのさまざまな要因がテーブルのインデックス作成方法の決定に影響します。テーブルにインデックスが多すぎることは、インデックスが少なすぎることと同じくらい悪いため、常にトレードオフです。最も重要なクエリが十分にカバーされていることを確認してから、追加のインデックスがコストに見合うかどうかをケースバイケースで判断してください。

また、まだ言及されていないため、少なくとも SQL Server 2005 を使用している場合: 非クラスター化インデックスの INCLUDE 句を挿入させてください。これは見過ごされがちですが、インデックス作成戦略にとって非常に便利な追加機能です。

于 2010-02-09T10:54:47.347 に答える