И так входит в искусство настройки производительности и стратегии индексации ...
Мне кажется логичным изменить существующее определение индекса, чтобы включить предложенные столбцы
Я собираюсь взять вашу цитату и написать третье определение индекса:
create index [idx_index3]
on [table1] (col1, col2, col3)
include (col4, col5, col6....);
Это должно быть CREATE INDEX
утверждение, которое соответствует вашему цитируемому заявлению.
Это очень хорошо может быть разумным решением, но это зависит . Вот несколько примеров, когда я говорю, что это зависит.
Если у вас общая рабочая нагрузка, которая в основном состоит из запросов, подобных этому:
select col1, col2, col3
from table1
where col1 = 1
and col2 = 2
and col3 = 3;
Тогда ваш idx_index1
индекс будет твердым. Совершенно узкий, это индекс, который удовлетворяет этому запросу без посторонних данных в нем (не принимая во внимание определение кластерного индекса, если оно вообще существует).
Но если у вас есть рабочая нагрузка, которая состоит из запросов в основном, как показано ниже:
select co11, col2, col3, col4, col5
from table1
where col1 = 1
and col2 = 2;
Тогда idx_index2
было бы разумно, так как это то, что называется индексом покрытия, предотвращающим необходимость поиска ключа в кластеризованном индексе (или поиска RID в куче). Это определение некластеризованного индекса будет охватывать только все данные, которые необходимы для запроса.
С вашей рекомендацией, это было бы хорошо для запроса, подобного следующему:
select co11, col2, col3, col4, col5
from table1
where col1 = 1
and col2 = 2
and col3 = 3;
Ваша idx_index3
рекомендация - это индекс покрытия, который удовлетворяет критериям поиска для вышеуказанного запроса.
Дело в том, к чему я стремлюсь, в таком изолированном вопросе, как этот, мы не можем дать на него окончательный ответ. Все зависит от общей и частой рабочей нагрузки. Конечно, вы всегда можете определить все три из этих индексов для обработки каждого типа запроса, но тогда возникает вопрос об обслуживании, которое потребуется для обновления этих индексов (подумайте: INSERTs, UPDATEs, DELETEs). Это накладные расходы на индексы.
Вам необходимо проанализировать и оценить рабочую нагрузку и определить, где преимущества будут наилучшими. Если первый примерный запрос является наиболее распространенным и выполняется десятки раз в секунду, и существует очень редкий запрос, такой как третий примерный запрос, то не имеет смысла раздувать листовые страницы индекса с помощью INCLUDE
неключевые столбцы. Все зависит от вашей рабочей нагрузки.
Если вы понимаете разумные стратегии индексации и понимаете свою общую рабочую нагрузку, то, применив оба из них, вы сможете найти оптимальный путь.