2013-06-08 2 views
1

У меня был кластеризованный индекс на 5 клавишах (столбцах). У меня был некластеризованный индекс на 2 столбца. Поскольку я вставляю 2-3 миллиона строк за один проход, я сменил 2-х столбчатый некластеризованный индекс на кластеризованный и изменил 5 столбчатых кластеризованных индексов на 5 столбцов некластеризованного индекса. Мой вопрос.Кластерный и некластеризованный индекс большой вставкой данных

  1. При создании индекса кластерный (в основном удалить и пересоздать индекс как clustered), я не нужен include (столбцы) верно, так как это кластерный?

  2. Как правило, верно, что я переключаю индекс столбцов меньше на кластеризованные и изменяю большой кластерный индекс столбца на неклассифицированный? Другими словами, кластеризованный индекс должен быть простым и малым?

  3. Есть ли проблемы с производительностью, если я переключаю эти два индекса?

ответ

0

Если это не таблица ссылок, у вас обычно есть кластеризованный индекс на 1 столбец. И общая рекомендация - выбрать наименьший возможный тип для столбца с кластерным индексом (безусловно, который соответствует вашим требованиям). Наличие множества столбцов не только увеличивает размер (каждый некластеризованный индекс сохраняет значение кластерного индекса [включает кластерный индекс]!), но также значительно увеличивает шансы на внешнюю фрагментацию и ухудшает производительность даже inserts. Таким образом, мои ответы на ваши вопросы.

  1. Это правильно, кластерный индекс представляет собой таблицу, нет необходимости включать в себя все столбцы
  2. Да, абсолютно
  3. Я не уверен, что, если вы спрашиваете о выполнении переключения себя или влияние на производительность наличия меньший (или меньше столбцов) кластерный индекс, поэтому я постараюсь ответить на оба.
    • Переключение. Когда вы переключаете кластерный индекс на некластеризованный, я считаю, что он не должен быть дорогим (я не думаю, что движок будет фактически перетасовывать блоки и экстенты, чтобы сделать кучу). Определенно IAM должен быть изменен, что потребует времени. Изменение некластеризованного индекса для кластеризации предполагает гораздо большую активность. Помимо перемещения данных в соответствии с кластеризованным ключевым ключом, SQLServer должен обновлять все некластеризованные индексы.
    • Дальнейшее воздействие (довольно большая тема, я поставил очень короткий ответ). Меньший кластеризованный индекс означает меньшее пространство, необходимое для хранения всех других индексов, что, в свою очередь, означает более быстрый доступ к данным и меньшее потребление ресурсов движком.

Update Я понял (благодаря Aaron Bertrand за указание, что выход) я сделал весьма расплывчатое заявление о включении кластерного индекса для некластеризованных индексов. Чтобы быть абсолютно правильным, каждый некластеризованный индекс включает в себя локатор строк, который указывает на строку. Когда таблица кластеризована, локатор строк - это кластерный индексный ключ. More info regarding clustered indexes.

+0

+1 Вы намекали на это, но чтобы быть более явным, ключ кластеризации включен во все некластеризованные индексы ... поэтому чем шире это, тем более широкие все некластеризованные индексы тоже. –

+0

@ Аарон Бертран: Спасибо, я сделаю это смелым, чтобы привлечь больше внимания. – a1ex07

+0

Да, я вижу это сейчас в 1-м абзаце, я так и не понял, что это было смутно указано только в последней пуле. –

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