
У меня есть база данных SQL Server. Насколько я понимаю, кластеризованные индексы наиболее эффективны, но они физически упорядочивают страницы, чтобы сделать их эффективными. Так что, если это поле, введенное пользователем, каждый раз, когда добавляется новая запись, вся таблица должна реструктурироваться.
Это не может быть эффективно. Так эффективно ли в данном случае размещение обычного индекса на поле? Или вы просто оставите его неиндексированным?
решение1
Как правило, вам следует использовать только кластеризованные индексы для полей Identity, и лучше всего подходят автономера, поскольку они постоянно увеличиваются. Обновление столбца идентификатора — это то, что вам следует делать примерно раз в тысячелетие, и уж точно не во время выполнения приложения, поэтому вам никогда не придется переупорядочивать содержимое страницы с помощью стандартного оператора DML.
В рамках этих ограничений кластеризованные индексы очень эффективны, но, как вы отметили, при неправильном использовании они могут стать серьезным тормозом для производительности операторов DML в индексированном поле.
Поэтому короткий ответ: не используйте кластеризованные индексы для полей, введенных пользователем.
Что касается некластеризованных индексов, они могут быть как большим благом, так и недостатком, в зависимости от их использования. NCI очень хороши для извлечения одной или небольшого количества строк, но размер индекса растет с каждым добавленным к нему полем, поэтому сложные многополевые индексы или индексы, которые могут разрешить запрос только к большому количеству строк, по крайней мере, не обеспечивают выгоды и часто являются скорее обузой, чем пользой.