Что произойдет, если кластеризованный индекс не уникален? Может ли это привести к снижению производительности из-за того, что вставленные строки перетекают на страницу «переполнения»?
"Сделано" ли оно уникальным, и если да, то как? Как лучше всего сделать его уникальным?
Я спрашиваю, потому что в настоящее время я использую кластерный индекс для разделения моей таблицы на логические части, но производительность так себе, и недавно я получил совет сделать свои кластерные индексы уникальными. Я хотел бы получить второе мнение по этому поводу.
Благодаря!
источник
Мне нравится проверять, что королева индексации Кимберли Трипп говорит по этой теме:
Я собираюсь начать с моей рекомендации по ключу кластеризации - по нескольким причинам. Во-первых, это несложное решение, а во-вторых, заблаговременное принятие этого решения помогает заранее предотвратить некоторые типы фрагментации. Если вы можете предотвратить определенные типы фрагментации базовой таблицы, то вы можете свести к минимуму некоторые действия по обслуживанию (некоторые из которых в SQL Server 2000 И меньше в SQL Server 2005) требуют, чтобы ваша таблица была отключена. Хорошо, я займусь восстановлением позже ...
Начнем с ключевых вещей, которые я ищу в ключе кластеризации:
Почему уникальный? Ключ кластеризации должен быть уникальным, поскольку ключ кластеризации (если он существует) используется в качестве ключа поиска для всех некластеризованных индексов. Возьмем, к примеру, указатель в конце книги - если вам нужно найти данные, на которые указывает запись указателя - эта запись (запись указателя) должна быть уникальной, в противном случае, какая запись указателя будет той, которую вы ищете ? Итак, когда вы создаете кластерный индекс - он должен быть уникальным. Но SQL Server не требует, чтобы ваш ключ кластеризации создавался в уникальном столбце. Вы можете создать его в любом столбце (ах) по своему желанию. Внутренне, если ключ кластеризации не является уникальным, SQL Server «унифицирует» его, добавляя к данным 4-байтовое целое число. Таким образом, если кластеризованный индекс создается для чего-то, что не является уникальным, это означает не только дополнительные накладные расходы при создании индекса, но и потраченное впустую дисковое пространство,
Источник: постоянно растущие споры о кластеризации - снова!
источник
newsequentialid()
для получения почти последовательного GUID. Но да: если вы добавляете свой собственный уникальный идентификатор (я всегда предпочитаю INT IDENTITY), тогда у вас есть это значение под рукой, и вы можете его использовать (например, для установления отношения FK). Уникальные свойства, добавленные SQL Server, невидимы для вас и, следовательно, они только накладные расходы, которые вы не можете использовать.Они этого не делают, и бывают случаи, когда лучше, если это не так.
Рассмотрим таблицу с полуслучайным, уникальным EmployeeId и DepartmentId для каждого сотрудника: если ваш оператор выбора
SELECT * FROM EmployeeTable WHERE DepartmentId=%DepartmentValue%
тогда лучше всего для производительности, если
DepartmentId
это кластерный индекс, хотя (или даже особенно потому, что) это не уникальный индекс (лучше всего для производительности, потому что он обеспечивает кластеризацию всех записей в пределах данного DepartmentId).Там же кластерный индекс Design Guidelines , например, в котором говорится,
Я понимаю, например, что «высокая степень уникальности» состоит в том, что нехорошо выбирать «Страна» в качестве кластерного индекса, если большинство ваших запросов хотят выбирать записи в данном городе.
источник