Назад | Перейти на главную страницу

Правила выбора столбца некластеризованного покрывающего индекса

У меня есть таблица с примерно 19 столбцами, которая содержит разумно большой объем данных и в основном запрашивается для извлечения данных с помощью операторов выбора на основе другого предложения where. Поскольку эта таблица в основном запрашивается для получения данных, я подумал о создании некластеризованных индексов на основе различных предложений where, используемых в запросах. Кроме того, все запросы на получение возвращают все столбцы в таблице как часть списка выбора. Исходя из приведенной выше информации, у меня есть два вопроса по выбору индексов:

  1. предположим, что у нас есть следующие SP, которые запрашивают как:

где [col_a] = {значение} и [col_b] = {значение}

[col_b] = {значение} и [col_a] = {значение}

[col_a] = {значение} и [col_c] = {значение} и [col_d] = {значение}

[col_a] = {значение} и [col_c] = {значение}

Я создал следующие некластеризованные индексы для таблицы как

[col_a] и [col_b] -> Будет ли первый ИП по-прежнему использовать этот индекс, когда заказы меняются

[col_a] и [col_c] и [col_d] -> Будет ли последний ИП использовать этот индекс, так как первые два столбца соответствуют порядку

Кроме того, должны ли мы пойти дальше и попытаться определить некластеризованные индексы на основе предложений filter / join для получения SP в таблице?

  1. Поскольку список выбора во всех SP возвращает весь список столбцов, я добавил все столбцы таблицы в качестве включенных столбцов в некластеризованные индексы (охватывающий индекс), чтобы избежать поиска по закладкам. Это правильный подход? Каковы будут последствия для пространства в этом случае, поскольку мы сохраняем все столбцы таблицы как часть определения индекса?

1: порядок столбцов индекса не имеет значения, если в запросе используются оба столбца (либо в предложении WHERE, либо в условии JOIN).

2: Можно использовать частичный индекс, считая слева: (a, b) можно использовать при поиске по а в одиночестве.

Поскольку столбец A используется во всех 4 запросах, я предлагаю вам всегда включать его в свои индексы.

Затем столбцы A и C также используются вместе, так что получается ваш второй индекс:

IX_1 (col_a, col_b)
IX_2 (col_a, col_c, col_d)

должен дать вам оптимальную производительность.

Я предполагаю, что один из этих столбцов является PK - если нет, вам нужно создать его.

Индексы Coverig, включающие все столбцы, - очень плохая идея, потому что поиск PK намного дешевле, чем накладные расходы, связанные с необходимостью поддерживать 2 полные копии данных таблицы.

Покрывающий индекс, включающий все столбцы, конечно же, является копией всей таблицы.