Сигле-столбчатый или многоколоночный индекс (-ы)?

#sql-server #database #indexing

#sql-сервер #База данных #индексирование

Вопрос:

У меня есть таблица с 3 столбцами: «Id», «A», «B». Все они доступны для поиска. Идентификатор — это идентификатор, который используется только для поиска точных строк, чтобы все было понятно. Но у меня есть сомнения по поводу «А» и «Б». У меня есть 3 случая для поиска в моем приложении: поиск по «A», поиск по «B» и поиск по «A» и «B» одновременно. Поэтому я не уверен, какой тип индекса выбрать. Должен ли я использовать два индекса с одним столбцом или один многоколоночный? Или, может быть, лучше объединить одностолбцовые индексы с многостолбцовыми (всего 3 индекса)? Меня действительно не волнует продолжительность ВСТАВКИ / ОБНОВЛЕНИЯ / УДАЛЕНИЯ, мой целевой приоритет — сделать ВЫБОР как можно быстрее. Я использую SQL Server 2017. Спасибо.

Ответ №1:

Я думаю, двух дополнительных индексов будет достаточно:

 CREATE INDEX IDX_YourTable_AB ON YourTable(A,B) -- the first column here which has more different values
CREATE INDEX IDX_YourTable_B ON YourTable(B)INCLUDE(A)
  

Если у вас есть другие столбцы в этой таблице, вы можете создать включенные индексы:

 CREATE INDEX IDX_YourTable_AB ON YourTable(A,B) INCLUDE(C,D,E,...)
CREATE INDEX IDX_YourTable_B ON YourTable(B) INCLUDE(A,C,D,E,...)
  

Индекс IDX_YourTable_AB может использоваться для условий WHERE A='...' или WHERE A='...' AND B='...' или WHERE A LIKE '...%' AND B='...' — используется только A столбец или A amp; B столбцы.

Индекс IDX_YourTable_B может использоваться для условий B только со столбцом ( WHERE B='...' или WHERE B LIKE '...%' ).

Также попробуйте протестировать CREATE INDEX IDX_YourTable_BA ON YourTable(B,A) вместо CREATE INDEX IDX_YourTable_B ON YourTable(B)INCLUDE(A) . Может быть, так будет лучше.