Индекс - это структура данных, предназначенная для оптимизации запросов больших наборов данных.Таким образом, не делается никаких заявлений о том, является ли что-либо уникальным на данный момент.
Вы можете определенно иметь неуникальные некластеризованные индексы - как еще можно индексировать по фамилии, имени ??Это никогда не будет уникальным (например, на Facebook .....)
Вы можете определить индекс как уникальный - это просто добавляет дополнительную проверку, что повторяющихся значений нетпозволил.Если вы сделаете свой индекс по (фамилия, имя) УНИКАЛЬНЫМ, то второй Брэд Питт, который зарегистрируется на вашем сайте, не сможет этого сделать, поскольку этот уникальный индекс будет отклонять его данные.
Единственным исключением является первичный ключ для любой таблицы.Первичный ключ - это логический идентификатор, используемый для уникальной и точной идентификации каждой отдельной строки в вашей базе данных.Таким образом, он должен быть уникальным для всех строк и не может содержать никаких значений NULL.
Кластерный индекс в SQL Server отличается тем, что он содержит фактические данные в своих конечных узлах.До этого момента нет никаких ограничений - однако: кластерный индекс также используется для уникального определения местоположения (физического расположения) данных в вашей базе данных, и, таким образом, кластерный индекс должен быть уникальным - он должен быть в состояниирассказать Брэду Питту № 1 и Брэду Питту № 2 отдельно.Если вы не позаботитесь и не предоставите уникальный набор столбцов для своего кластерного индекса, SQL Server добавит «uniquefier» (4-байтовый INT) к тем строкам, которые не являются уникальными, например, вы получите BradPitt001 иBradPitt002 (или что-то в этом роде).
Кластерный индекс используется в качестве «указателя» на фактическую строку данных в вашей таблице SQL Server, поэтому он также включается в каждый отдельный некластеризованный индекс.Таким образом, ваш некластеризованный неуникальный индекс (фамилия, имя) будет не только содержать эти два поля, но на самом деле он также содержит кластеризованный ключ в этой таблице - поэтому важно, чтобы кластеризованныйключ в таблице SQL Server небольшой, стабильный и уникальный - обычно INT.
Таким образом, ваш некластеризованный индекс (фамилия, имя) действительно будет иметь (фамилия, имя, personID) и будет иметь записикак (Pitt, Brad, 10176)
, (Pitt, Brad, 17665)
и так далее.Когда вы ищете «Брэда Питта» в некластеризованном индексе, SQL Server теперь найдет эти две записи, и для обеих он имеет «физический указатель», где найти остальные данные для этих двух парней, поэтомуесли вы запрашиваете больше, чем просто имя и фамилию, SQL Server теперь может взять всю строку для каждой из двух записей Брэда Питта и предоставить вам данные, необходимые для запроса.