Здесь есть две концепции:
- кластерные и некластеризованные индексы
- покрывающие индексы
Покрывающий индекс - это тот, который может удовлетворитьпредложение where в вашем запросе.Поскольку у вас может быть несколько запросов к вашим данным, данный индекс может «покрывать» один запрос, но не другой.
В вашем примере IX_FIRSTNAME является индексом покрытия для запроса
select FirstName from Customers where FirstName Like 'T*';
,
, но не для запроса
select FirstName from Customers where FirstName Like 'T*' and City Like 'London';
.
Большая часть оптимизации производительности сводится к тому, чтобы «понять ваши запросы, особенно предложение where, и дизайн, охватывающий индексы».Создание индексов для каждой возможной комбинации столбцов - плохая идея, так как индексы имеют собственные затраты производительности.
Вторая концепция - «кластеризованные» и «некластеризованные» индексы.Это скорее физическая проблема - при кластеризованном индексе данные хранятся на диске в порядке индекса.Это делает его идеальным для создания индекса по первичному ключу таблицы (если ваш первичный ключ является возрастающим целым числом).В вашем примере вы должны создать кластеризованный индекс для custid, который будет охватывать следующий запрос:
select FirstName from Customers where custid = 12
Это также поможет объединениям (например, от клиента к заказу).