как превратить некластеризованный индекс в покрывающий индекс - PullRequest
0 голосов
/ 19 июня 2019

Я погуглил индекс покрытия и нашел:

"Покрывающий индекс - это особый тип составного индекса, в котором все столбцы существуют в индексе."

Я понимаю, что основная цель - сделать так, чтобы некластеризованный индекс не просматривал кластеризованный индекс, а для SQL Server мы можем использовать столбцы «ВКЛЮЧИТЬ» при создании индекса, поэтому SQL Server добавляет их на уровне листа индекс. Поэтому нет необходимости искать через индекс кластера.

Но у нас есть таблица Customers (CustID, FirstName, City) с кластеризованным индексом CustID.

если мы создадим некластеризованный индекс (называемый IX_FIRSTNAME) для столбца FirstName и включим этот столбец в качестве полезной нагрузки в конечный узел индекса и сделаем запрос как:

select FirstName from Customers where FirstName Like 'T*';

поэтому в этом случае нет необходимости просматривать кластерный индекс, поэтому можно ли IX_FIRSTNAME рассматривать в качестве покрывающего индекса?

или это должно соответствовать требованию для всех столбцов? и нам нужно создать некластеризованный для всех трех столбцов индекс покрытия?

1 Ответ

1 голос
/ 19 июня 2019

Здесь есть две концепции:

  • кластерные и некластеризованные индексы
  • покрывающие индексы

Покрывающий индекс - это тот, который может удовлетворитьпредложение 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

Это также поможет объединениям (например, от клиента к заказу).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...