2

A clustered index хранит фактические строки данных на уровне листа индекса. Возвращаясь к приведенному выше примеру, это означало бы, что вся строка данных, связанная с значением первичного ключа 123, будет храниться в этом листовом узле.Кластерные индексы без первичного ключа

enter image description here

Вопрос - в случае, если первичный ключ не существует, и я поставил Name столбец в качестве кластерного индекса. В этом случае будет ли противоречащим вышеназванное утверждение?

+1

Я считаю, что уникальные кластеризованные ключи также получат до 4 байтов для определения данных. Поэтому колонка имени не обязательно должна быть уникальной. –

+1

Рассмотрите вопрос, например, на [DBA.SE] (http://dba.stackexchange.com/). У нас очень целевая аудитория, которая хотела бы ответить на такие вопросы. –

ответ

13

Нет - почему?

кластерный индекс еще магазина фактические данные страницы на своем уровне листьев, (первоначально) физически отсортированы по name колонку.

Структура указателя навигации над уровнем листа будет содержать значения столбцов name для всех строк.

Так что в целом: ничего не меняется.

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

Индекс кластеризации является физической конструкции, которая будет (первоначально) phyiscally сортировать данные по ключу кластеризации и организовать страницы SQL Server соответственно.

В то время как в SQL Server первичный используется по умолчанию как ключ кластеризации, эти два не должны падать вместе - и не должно существовать с другим. Вы можете иметь таблицу с некластеризованным первичным ключом или кластерную таблицу без первичного ключа. Оба варианта возможны. Имеет ли смысл иметь это еще одно обсуждение, но это технически возможно.

Update: если ваш первичный ключ ключ кластеризации, уникальность гарантируется (поскольку первичный ключ должен быть уникальным). Если вы выбираете какой-то столбец, который не является основным ключом в качестве ключа кластеризации, и этот столбец не гарантирует уникальности, SQL Server будет - за кулисами - добавьте 4-байтовый (INT) столбец-идентификатор к этим значениям дубликатов, чтобы сделать они уникальны. Таким образом, у вас могут быть Smith, Smith1, Smith2 и т. Д. В вашей кластерной навигационной структуре индекса для вашего Смита.

См:

+0

Итак, как определяются определители строк в этом случае, которые указывают на фактические строки данных? Я имею в виду, что имя может быть дублирующимся. правильно? – Nilish

+0

Вы можете поделиться ссылкой, в которой говорится об этом факте? Благодарю. Это мой последний комментарий. – Nilish

+0

можете ли вы обновить свой ответ этими двумя ссылками? – Nilish

1

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

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

Для кластерного индекса столбец не обязательно должен быть уникальным и/или без нуля. Столбец с дубликатами и нулевыми значениями подходит для создания кластерного индекса.

Для внешнего ключа он должен ссылаться на столбец с уникальным индексом на нем, но необязательно на первичный ключ или без нулевого значения. Совершенно легально ссылаться на столбец, который не является первичным ключом, и допускает нулевое значение, поскольку на нем есть уникальный индекс. Обратите внимание, что, поскольку на нем должен быть уникальный индекс, этот столбец не может иметь больше одного значения null.

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

+0

, если столбец (столбцы), используемые для кластерного индекса, не уникальны, SQL Server * сделает * уникальным - добавив 4-байтовый идентификатор. Это дополнительные накладные расходы, о которых вам нужно знать. Вы * можете * использовать неповторимый столбец - я не думаю, что это очень хорошая идея в целом, для этого. –

+0

+1 Спасибо за помощь. – Nilish

3

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