2

次のことを前提としています。

/*

drop index ix_vouchers_nacsz on dbo.vouchers;
drop index ix_vouchers_nacsz2 on dbo.vouchers;

create index ix_vouchers_nacsz on dbo.Vouchers(
    FirstName, LastName,
    Address, Address2, City,
    State, Zip, Email
);

create index ix_vouchers_nacsz2 on dbo.Vouchers(
    Email, FirstName, LastName,
    Address, Address2, City,
    State, Zip
);

*/

select count(firstname) from vouchers
    with (index(ix_vouchers_nacsz))
where 
    firstname = 'chris' and
    lastname = '' and
    address = '' and
    address2 = '' and
    city = '' and
    state = '' and
    zip = ''

select count(firstname) from vouchers
    with (index(ix_vouchers_nacsz2))
where 
    firstname = 'chris' and
    lastname = '' and
    address = '' and
    address2 = '' and
    city = '' and
    state = '' and
    zip = ''

2番目のインデックスがインデックススキャンになり、最初のインデックスがインデックスシークになるのはなぜですか?キーの順序はどのように異なりますか?

4

3 に答える 3

5

2 番目のインデックスは電子メール フィールドで始まりますが、電子メールをフィルタリングしていません。それはインデックスを役に立たなくします。

インデックスは通常、バイナリ検索を実行できるb ツリーです。B ツリーは、そのインデックス フィールドによって並べ替えられます。したがって、最初のフィールドがわかっている場合は、すぐに調べることができます。最初のフィールドの同じ値内で、2 番目のフィールドをすばやく検索できます。

苗字順の電話帳のようなものです。特定の電話番号を検索するために使用することはできません。

于 2009-08-10T05:19:47.493 に答える
0

インデックスの場合、「index での列の順序」、「where 句での列の順序」が多く当てはまります。次のリンクを参照できます。

http://ashishkhandelwal.arkutil.com/sql-server/quick-and-short-database-indexes/

•インデックスを使用するためのベスト プラクティス •最適なパフォーマンス フォーム インデックスを取得する方法 •クラスタ化インデックスに関する考慮事項 •非クラスタ化インデックスに関する考慮事項

これは、インデックスを計画するときに役立つと確信しています。

于 2012-06-26T06:31:07.213 に答える
0

「電話帳」のアナロジーを適用すると、理解に役立つ場合があります。

最初のインデックスは、FirstName、Last Name などでソートされた「電話帳」です。この電話帳で Chris を検索するように要求された場合、すべての Chris が一覧表示されているインデックスを見つけることができます。

2 番目のインデックスでは、'電話番号' (または簡単に電子メール) で並べ替えられた電話帳があり、名前、姓の順に並べられています。この電話帳を使用して Chris というファーストネームのリストを検索するように求められた場合、運が悪いことに、電話帳はそのように並べ替えられていません。もちろん、電子メール アドレス example@example.com と名前 Chris を探すように求められた場合は、最初に電子メール アドレスを見つけてから、一致する名前を探すことができます。

于 2009-08-10T08:39:15.050 に答える