Лучше использовать кластерный индекс или некластеризованный индекс с включенными столбцами? - PullRequest
4 голосов
/ 22 января 2010

Когда я смотрю на план выполнения для определенного запроса, я обнаруживаю, что 77% моих затрат приходится на поиск кластерного индекса.

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

Было бы лучше для меня создать некластерную версию этого и включить все столбцы, которые выводятся?

UPDATE: Кластерный индекс использует составной ключ. Не уверен, что это имеет значение.

Ответы [ 3 ]

4 голосов
/ 23 января 2010

Причина, по которой вы используете столбцы в некластеризованном индексе, заключается в том, чтобы избежать «поиска по закладкам» в кластеризованных данных. Дело в том, что если SQL Server теоретически может использовать определенный некластеризованный индекс, но, по оценкам Оптимизатора, будет слишком много просмотров закладок, тогда этот индекс будет игнорироваться. Однако, если все выбранные столбцы доступны непосредственно из индекса, нет необходимости в поиске закладок.

В вашем случае тот факт, что вы получаете доступ к данным через «поиск по кластеризованному индексу», очень многообещающий. Будет очень трудно улучшить его производительность. Некластеризованный индекс, включающий все выбранные столбцы, может быть немного быстрее, но только потому, что необработанные данные немного меньше. ( Но не забывайте о стоимости увеличенного времени вставки / обновления .)

Тем не менее, вы должны проверить детали ...

  • Если вы используете составной ключ, а поиск происходит только в начале ключа, вам может не повезти. Вы можете обнаружить, что поиск только сужается до 500 000 строк, а затем выполняет поиск по другим критериям. В этом случае поэкспериментируйте с некоторыми некластеризованными индексами.
  • Кластерный индекс сам по себе может быть в порядке; но если это делается 100 000 раз в вашем запросе, потому что какой-то другой аспект неэффективно возвращает слишком много строк - тогда вы не получите много, улучшив производительность поиска по кластерному индексу.

Наконец, уточните комментарий Давека: «стоимость относительна». То, что кластеризация составляет 77% от стоимости вашего запроса, не означает, что есть проблема. Можно написать тривиальный запрос к 1 таблице, который возвращает строку извлечения и стоимость поиска в кластеризованном индексе на уровне 100%. (Но, конечно, будучи единственной «проделанной работой», это будет составлять 100% работы ... и 100% мгновенного использования по-прежнему мгновенного .
Итак: «Не волнуйся, будь счастлив!»

1 голос
/ 22 января 2010

У вас уже есть поиск, поэтому выгоды могут быть минимальными.

Вы можете попробовать это все же. Опции:

  • 2-й некластеризованный индекс, сохранить оригинал
  • переместить кластерный индекс в другой столбец (столбцы)

Есть ли другие хорошие кластерные кандидаты? Обратите внимание, вам всегда нужен уникальный кластеризованный индекс (из-за уникальных + здесь SO + здесь ). И конечно, какой у тебя ПК, пожалуйста?

0 голосов
/ 22 января 2010

Это зависит от того, сколько столбцов вы говорите, если пара, то да, некластеризованный индекс будет работать лучше, если вы выбираете большинство столбцов, кластеризованный индекс лучше.

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