Ну, первый вопрос прост:
Когда следует использовать кластерный индекс?
Всегда. Период. За исключением очень немногих, редких, крайних случаев. Кластерный индекс делает таблицу быстрее для каждой операции. ДА! Оно делает. См. Превосходную Ким Трипп * Дебаты по кластерным индексам продолжаются для получения дополнительной информации. Она также упоминает свои основные критерии для кластерного индекса:
- 1012 * узкая *
- статический (никогда не меняется)
- уникальный
- если возможно: постоянно увеличивается
INT IDENTITY выполняет это отлично - GUID нет. См. GUID в качестве первичного ключа для получения дополнительной справочной информации.
Почему узкий? Поскольку ключ кластеризации добавляется к каждой странице индекса каждого и каждого некластеризованного индекса в одной и той же таблице (для того, чтобы иметь возможность на самом деле искать строку данных, если нужно). Вы не хотите иметь VARCHAR (200) в своем ключе кластеризации ....
Почему уникален ?? См. Выше - ключ кластеризации - это элемент и механизм, который SQL Server использует для уникального поиска строки данных. Это должно быть уникальным. Если вы выберете неуникальный ключ кластеризации, SQL Server сам добавит 4-байтовый уникализатор к вашим ключам. Будьте осторожны с этим!
Далее: некластеризованные индексы. По сути, есть одно правило: любой внешний ключ в дочерней таблице, ссылающейся на другую таблицу, должен быть проиндексирован, это ускорит JOIN и другие операции.
Кроме того, любые запросы с предложениями WHERE являются хорошим кандидатом - выберите те, которые выполняются первыми. Поместите индексы в столбцы, которые отображаются в предложениях WHERE, в операторах ORDER BY.
Далее: измерьте свою систему, проверьте DMV (динамические административные представления) на наличие подсказок о неиспользуемых или отсутствующих индексах и настраивайте свою систему снова и снова. Это непрерывный процесс, вы никогда не будете делать! См. здесь для информации об этих двух DMV (отсутствующие и неиспользуемые индексы).
Еще одно предупреждение: благодаря большому количеству индексов вы можете сделать любой запрос SELECT действительно очень быстрым. Но в то же время могут пострадать ВСТАВКИ, ОБНОВЛЕНИЯ и УДАЛЕНИЯ, которые должны обновлять все задействованные индексы. Если вы только выбираете - сходите с ума! В противном случае, это прекрасный и тонкий баланс. Вы всегда можете изменить один запрос до предела, но остальная часть вашей системы может пострадать от этого. Не переиндексировать вашу базу данных! Поместите несколько хороших показателей на место, проверьте и посмотрите, как работает система, а затем, возможно, добавьте еще один или два, и снова: посмотрите, как это влияет на общую производительность системы.