SQL Server - когда использовать кластерный или некластерный индекс?

99

Я знаю основные различия между кластерными и некластеризованными индексами и понимаю, как они на самом деле работают. Я понимаю, как кластерные и некластеризованные индексы улучшают производительность чтения. Но я не уверен в одном: по каким причинам я бы предпочел одно другому.

Например: если таблица не имеет кластеризованного индекса, следует ли создавать некластеризованный индекс и каковы преимущества этого

армулятор
источник
3
Спасибо за ответ. Я уже знаю об этом. Мой вопрос: возникнет ли ситуация, когда создание некластеризованного индекса принесет больше пользы, чем создание кластеризованного индекса?
Armulator
2
Да, вам следует избегать кластерного индекса, когда; столбец имеет низкую мощность, без определенного порядка, часто обновляется, непоследовательный, он составлен из многих столбцов ...
TI
Спасибо за Ваш ответ. Это полезно
армулятор
1
Возможно, этот вопрос поможет вам: stackoverflow.com/questions/5070529/…
Дэвид Гарсия Гонсалес
Возможный дубликат. В какой столбец следует поместить кластерный индекс?
Майкл Фрейджейм,

Ответы:

118

Я просто хочу предупредить: очень внимательно выберите кластерный индекс! Каждая «обычная» таблица данных должна иметь кластерный индекс, поскольку кластерный индекс действительно ускоряет множество операций - да, ускоряет , даже вставляет и удаляет! Но только если вы выберете хороший кластерный индекс.

Это наиболее реплицируемая структура данных в вашей базе данных SQL Server. Ключ кластеризации также будет частью каждого некластеризованного индекса в вашей таблице.

Выбирая ключ кластеризации, следует проявлять особую осторожность - он должен быть:

  • узкий (идеально 4 байта)

  • уникальный (в конце концов, это «указатель строки». Если вы не сделаете его уникальным, SQL Server сделает это за вас в фоновом режиме, что будет стоить вам пары байтов для каждой записи, умноженной на количество строк и количество некластеризованных индексов у вас есть - это может стоить очень дорого!)

  • статический (никогда не меняйте - если возможно)

  • в идеале постоянно увеличивающийся, поэтому вы не получите ужасную фрагментацию индекса (GUID - полная противоположность хорошему ключу кластеризации - по этой конкретной причине)

  • он не должен допускать значения NULL и в идеале также фиксированной ширины - a varchar(250)делает очень плохой ключ кластеризации

Все остальное действительно должно быть вторым и третьим уровнем важности после этих пунктов ...

Посмотрите несколько сообщений в блоге Кимберли Трипп ( Королева индексирования ) по этой теме - все, что она написала в своем блоге, абсолютно бесценно - прочтите, усвойте - живите этим!

marc_s
источник
1
Спасибо marc_s за четкое объяснение. Но с технической точки зрения, что non clusteredдля нас делает index. в чем его важность ..?
hud
@nad: правильно подобранный некластеризованный индекс может ускорить ваш поиск - вместо того, чтобы сравнивать потенциально миллионы строк данных с вашими критериями поиска, вы можете найти данную строку всего за 4, 5 сравнений. Это ОГРОМНАЯ разница!
marc_s
1
@MuriloKunze: прочитать сообщение в блоге Ким Tripp по этой теме - объясняет она в деталях , почему это так
marc_s
5
Извините, но где же ответ на вопрос «SQL Server - когда использовать кластерный или некластерный индекс?» ?
Эдуард