Что такое индекс и может ли некластерный индекс быть неуникальным? - PullRequest
8 голосов
/ 27 сентября 2010

Под вопрос к моему вопросу [1]:

Все определения индекса (MS SQL Server) (которые я смог найти) неоднозначны, и все объяснения, основанные на нем, повествуют что-то, используя неопределенные или неоднозначно определенные термины.
Какое определение для индекса?

Например, наиболее распространенное определение индекса из вики (http://en.wikipedia.org/wiki/Index_(database)):

  • 1) "Индекс базы данных - это структура данных, которая повышает скоростьопераций поиска данных в таблице базы данных за счет более медленных операций записи и увеличения пространства хранения. Индексы могут быть созданы с использованием одного или нескольких столбцов таблицы базы данных ... "
  • 2)" SQL-сервер создает кластеризованныйиндекс по первичному ключу по умолчанию [1]. Данные представлены в случайном порядке, но логический порядок определяется индексом. Строки данных могут быть случайно распределены по всей таблице. Некластеризованное дерево индекса содержит ключи индексав порядке сортировки, с уровнем листа индекса, содержащим указатель на страницу и номер строки на странице данных "

Ну, это неоднозначно.Под индексом можно понять:

  • 1) упорядоченную структуру данных, дерево, содержащее промежуточные и конечные узлы;
  • 2) данные конечного узла, содержащие значения из индексированных столбцов + «указатель на страницу и номер строки на странице данных»

Может ли некластеризованный индекс быть неуникальным,учитывая 2)или даже 1)?
Мне так не кажется ...

Но подразумевает ли TSQL существование неуникального некластерного индекса?

Если да, то Что понимается под некластеризованным индексом в "CREATE INDEX (Transact-SQL)" [2] и к чему там применяется аргумент UNIQUE?

Это:

  • 3) данные конечного узла, содержащие значения из проиндексированных столбцов?т.е. как в 2), но без указателя + номер строки)?

Если это 3), то снова возникает вопрос 1) - зачем применять ограничения для копирования реальных данных в «индекс», а не реальных данных на месте?


Обновление:
Не является ли закладка (указатель + номер строки) для реальной строки данных уникальной (уникально идентифицирует строку)?
Разве эта закладка не является частью индекса и, следовательно,делает индекс уникальным?
Можете ли вы дать мне определение индекса вместо объяснения, как его использовать НЕ УКАЗАНО?Последняя часть я уже знаю (или могу прочитать сам).


[1]
"УНИКАЛЬНЫЙ аргумент для создания ИНДЕКСА - для чего?"
УНИКАЛЬНЫЙ аргумент для создания ИНДЕКСА - для чего?

[2]
[CREATE INDEX (Transact-SQL)]
http://msdn.microsoft.com/en-us/library/ms188783.aspx

Ответы [ 2 ]

19 голосов
/ 27 сентября 2010

Индекс - это структура данных, предназначенная для оптимизации запросов больших наборов данных.Таким образом, не делается никаких заявлений о том, является ли что-либо уникальным на данный момент.

Вы можете определенно иметь неуникальные некластеризованные индексы - как еще можно индексировать по фамилии, имени ??Это никогда не будет уникальным (например, на 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 теперь может взять всю строку для каждой из двух записей Брэда Питта и предоставить вам данные, необходимые для запроса.

0 голосов
/ 27 сентября 2010

Определение индекса - это первая часть определения Википедии: «Индекс базы данных - это структура данных, которая повышает скорость операций поиска данных в таблице базы данных за счет более медленных операций записи и увеличения места для хранения».

Тогда у вас есть уникальные индексы, как особый вид индекса, который гарантирует, что индексированные значения уникальны.

Как это реализовано ... зависит от СУБД.Но это не меняет определения индекса или уникального индекса.

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

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

...