Должны ли кластеризованные индексы быть уникальными?


Что произойдет, если кластеризованный индекс не является уникальным? Может ли это привести к плохой производительности, потому что вставленные строки текут на страницу "переполнения" некоторых видов?

Это" сделано " уникальным и если да, то как? Каков наилучший способ сделать его уникальным?

Я спрашиваю, потому что в настоящее время я использую кластеризованный индекс для разделения моей таблицы на логические части, но производительность так себе, и недавно я получил совет сделать мои кластеризованные индексы уникальными. Я хотел бы получить второе мнение о что.

спасибо!

3 62

3 ответа:

Они не есть чтобы быть уникальным, но это, конечно, приветствуется.
Я еще не сталкивался со сценарием, в котором я хотел создать CI на не уникальном столбце.

что произойдет, если вы создать CI на не уникальном столбце

Если кластеризованный индекс не является уникальным индекс, SQL Server делает любой дубликат ключи уникальные, добавив внутренне сформированное значение называется uniqueifier

это приводит к плохой производительности?

добавлять uniqueifier конечно, добавляет некоторые накладные расходы при расчете и хранении его.
Если эти накладные расходы будут заметны зависит от нескольких факторов.

  • сколько данных в таблице.
  • какова скорость вставок.
  • как часто CI используется в select (когда нет индексов покрытия, в значительной степени всегда.)

Edit
как было указано Remus в комментариях, существуют случаи использования, когда создание не уникального CI было бы разумным выбором. Я не столкнулся с одним из этих сценариев, просто показывает мое собственное отсутствие экспозиции или компетентности (выберите свой выбор).

Я хотел бы проверить, что королева индексации, Кимберли Трипп, должен сказать по этой теме:

Я собираюсь начать с моей рекомендацией для ключа кластеризации - по нескольким причинам. Во-первых, это простое решение, и во-вторых, принятие этого решения на ранней стадии помогает активно предотвращать некоторые типы фрагментации. Если вы можете предотвратить определенные типы фрагментации базовой таблицы, то вы можете свести к минимуму некоторые действия по обслуживанию (некоторые из которых, в SQL Server 2000 И меньше из которых, в SQL Server 2005) требуют, чтобы ваша таблица была в автономном режиме. Ладно, я займусь восстановлением позже.....

давайте начнем с ключевых вещей, которые я ищу в ключе кластеризации:

* Unique
* Narrow
* Static

Почему Уникальной? Ключ кластеризации должен быть уникальным, поскольку ключ кластеризации (если он существует) используется в качестве ключа поиска из всех некластеризованных индексов. Возьмем, например, индекс в конце книги - если вы нужно найти данные, на которые указывает запись индекса - эта запись (запись индекса) должна быть уникальной в противном случае, какая запись индекса будет той, которую вы ищете? Итак, при создании кластеризованного индекса - он должен быть уникальным. Но SQL Server не требует, чтобы ключ кластеризации создавался в уникальном столбце. Вы можете создать его на любой столбец(ы) вы хотите. Внутренне, если ключ кластеризации не является уникальным, то SQL Server будет "унифицировать" его, добавив к данным 4-байтовое целое число. Так что если кластеризованный индекс создается на чем-то, что не является уникальным, тогда не только есть дополнительные накладные расходы при создании индекса, есть потерянное дисковое пространство, дополнительные затраты на вставки и обновления, а в SQL Server 2000 есть дополнительные затраты на перестройку кластеризованного индекса (что из-за плохого выбора ключа кластеризации теперь более вероятно).

источник:постоянно растущая кластеризация ключевых дебатов-снова!

должны ли кластеризованные индексы быть уникальными?

Они не делают, и есть моменты, когда это лучше, если они не являются.

Рассмотрим таблицу с полу-случайным, уникальным EmployeeId и DepartmentId для каждого сотрудника: если ваш оператор select

SELECT * FROM EmployeeTable WHERE DepartmentId=%DepartmentValue%

тогда это лучше для производительности, если DepartmentId является кластеризованным индексом, Хотя (или даже особенно потому, что) это не уникальный индекс (лучше всего для производительности, потому что он обеспечивает что все записи в пределах данного DepartmentId кластеризованы).


у вас есть какие-нибудь рекомендации?

здесь Рекомендации По Проектированию Кластеризованных Индексов например, который говорит:

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

  • может использоваться для часто используемых запросов.
  • обеспечивают высокую степень уникальности.
  • может использоваться в запросах диапазона.

мое понимание "высокой степени уникальности", например, заключается в том, что не стоит выбирать" страну " в качестве кластеризованного индекса, если большинство ваших запросов хотят выбрать записи в пределах данного города.