Вопрос об использовании индекса SQL Server - PullRequest
2 голосов
/ 10 августа 2009

Предполагая следующее:

/*

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 = ''

Почему второй индекс приводит к сканированию индекса, а первый - к поиску индекса? Какая разница в порядке расположения ключей?

Ответы [ 3 ]

5 голосов
/ 10 августа 2009

Второй индекс начинается с поля электронной почты, но вы не фильтруете электронную почту. Это делает индекс бесполезным.

Индексом, как правило, является b-дерево , которое позволяет выполнять двоичный поиск . B-дерево сортируется по полям индекса. Так что если вы знаете первое поле, вы можете быстро его найти. В пределах тех же значений первого поля вы можете быстро найти второе поле.

Это похоже на телефонную книгу, которая отсортирована по фамилии. Вы не можете использовать его для поиска определенного номера телефона.

0 голосов
/ 26 июня 2012

В случае индекса «порядок столбцов в индексе» «порядок столбцов в выражении where» будет иметь большое значение. Вы можете ссылаться на следующую ссылку:

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

• Рекомендации по использованию индексов • Как получить наилучшие показатели формы показателей • Кластерный индекс Соображения • Замечания по некластерным индексам

Я уверен, что это поможет вам при планировании индекса.

0 голосов
/ 10 августа 2009

Применение аналогии с «телефонной книгой» может помочь в понимании.

Первый индекс - это «телефонная книга», отсортированная по имени, фамилии и т. Д. Если вы попросили найти Криса в этой телефонной книге, вы можете найти всех Криса, перечисленных вместе по индексу.

Во втором индексе - это телефонная книга, отсортированная по «телефонным номерам» (или так же легко по электронной почте), затем по имени, фамилии и так далее. Если вас попросили использовать эту телефонную книгу для просмотра списков с именем Криса, ваша телефонная книга не удалась таким образом! Конечно, если вас попросили найти адрес электронной почты example@example.com и имя Крис, то сначала вы можете найти адрес электронной почты, а затем искать подходящие имена.

...