2013-12-20 9 views
0

У меня есть таблица с некластеризованным индексом1 на ID1 и ID2 в этом порядке.Оптимизация заказа нескольких индексов SQL Server

Select count(distinct(id1)) from table 

возвращает 1

и Select count(distinct(id2)) from table имеет все значения таблицы.

В querys к этой таблице использует ... where id1= XX and id2 = XX

Может сделать какое-либо улучшение производительности, если я изменить порядок полого INDEX1?

Я знаю, что ДОЛЖЕН быть лучше, но, может быть: это равнодушна, потому что id1 имеет только 1 значение?

+1

Ваш вопрос непонятен. В вашем запросе есть 'id', ваш индекс и' where' имеют 'id1' и' id2'. Можете ли вы попытаться выразить вопрос немного лучше? Примеры данных и желаемые результаты полезны. –

+0

Извините, отредактировано. Теперь это правильно. – user2920607

ответ

1

Если я правильно понимаю, вы сравниваете эти два заявления:

where id1= XX and id2 = XX 

В большинстве случаев, это будет использовать либо индекс по table(id1, id2) или table(id2, id1). Порядок сравнений в статьях where (или on) не влияет на то, какие индексы могут использоваться.

Следует ли включать столбец с единственным значением в уникальном индексе - это другое дело. Существует незначительный эффект производительности для более сложного индекса - древовидная структура должна хранить больше байтов для каждого ключа. Тем не менее, запрос:

select count(distinct id2) 
from table 
where id1 = xx and idx = xx 

будет реально работать быстрее с составным индексом, чем с одноплодным индексом table(id2).Причина в том, что составной индекс может использоваться для полного удовлетворения запроса (на жаргоне это «индекс покрытия для запроса»). Индекс singleton должен искать значение id1 в данных таблицы, что требует дополнительной обработки.

+0

Таким образом, это означает, что в этом конкретном случае независимо от порядка столбцов индекса было бы небольшое улучшение производительности между не использованием составного индекса или использованием индекса singleton потому что все значения id1 одинаковы? – user2920607

+0

@ пользователь2920607. , , Использование индекса в большинстве случаев будет работать лучше, чем без использования индекса. Синтаксис потребует поиска значений в данных таблицы. Компонент будет охватывать запрос и не требует дополнительной обработки. Вероятно, композит будет иметь немного лучшую производительность. –

0

Порядок, определяющий столбцы в вашем индексе. Если ваш идентификатор столбца ID1 всегда будет иметь только одно значение, тогда нет смысла помещать его в индекс, если вы не используете его в индексе покрытия в некластерном индексе (это означает, что индекс не является физическим порядком самой таблицы). В общем, ваш первый столбец, определенный в вашем Индексе, должен быть столбцом с самыми важными значениями, которые вам нужно искать. Визуализируйте его таким образом, если у вас есть таблица из 1 миллиона строк, а в первом столбце в вашем индексе только 1 (или небольшое число) различных значений, то этот индекс поможет вам найти строки, которые вы хотите, из 1 миллиона ? Или было бы лучше иметь ID2 в первую очередь, что было бы более эффективным для поиска и которое будет более часто использоваться, это то, о чем вы должны спросить себя. Ниже также более подробная информация по вашему вопросу.

SQL Server Clustered Index - Order of Index Question

Если вы используете некластерированный индекс, это может показаться не сделать иначе, если ваш первый колонке в индексе есть все то же значение. Однако это имеет значение, причина в том, что некластеризованный индекс хранится на нескольких страницах. Чем больше записей вы можете сохранить на странице, которая поможет вам быстрее искать быстрее. Если вы включаете столбец на странице, который не добавляет значения для поиска, то для этого требуется, чтобы один и тот же индекс охватывал больше страниц. Значит больше страниц для перелистания и более длинных поисков. Это также означает, что меньше места для добавления новых записей на существующую страницу во время вложений при обновлении индекса, что приводит к увеличению количества разделов страниц. Таким образом, есть побочные эффекты для принятия решения о добавлении Столбец только 1 значения в Индекс. Если вы используете колонку, чтобы «обрезать» найденные значения в общих элементах выбора, вы также можете использовать «Включенные столбцы» в своем Индексе, что имеет дополнительное преимущество, не изменяя ваш индекс и все же действует как закрытый индекс. Если это было изначально предназначено для добавления столбца, который имеет только 1 значение.

+0

«В общем, ваш первый столбец, определенный в вашем индексе, должен быть столбцом с самыми важными значениями, которые вам нужно искать через« . Я знал это, но в этом конкретном случае, если все значения id1 одинаковы, а индекс не является кластеризованным, я не знаю, что, возможно, это не имеет значения. Запросы: «update field1 ... where id1 = XX и id2 = XX» – user2920607

+0

Это имеет значение, оно уменьшает доступную комнату на каждой странице некластерного Индекс. Это может быть небольшая разница, зависит от вашей ситуации. Если вы используете столбцы в своем индексе не для целей поиска, а как «закрытое значение индекса», то вместо этого вы можете использовать «Включенные столбцы» в своем индексе. – CodeCowboyOrg

+0

В моем случае это не охваченный индекс, потому что обновленные значения не входят в определение индекса. Подводя итог, в моем случае индекс работает нормально, но он использует немного больше места для каждой страницы. Я беспокоюсь о быстродействии и изменении индекса, не будет заметной разницы. Спасибо за вашу помощь и исправьте меня, если я ошибаюсь – user2920607

Смежные вопросы