Понимание структуры первичного ключа по нескольким столбцам

Я пытаюсь понять, как индексация в SQL Server может помочь повысить производительность запроса select.

Таким образом, я понимаю, что структура b-дерева используется сервером SQL при индексации.

Ниже приведен простой пример.

Day (Primary Key)   Race Winner
1                   Dave
2                   Jill
3                   Jake
…   
199                 Jody
200                 Sam

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

Начните с корня> следующий 1 - 100 > следующий 1 - 50 и затем войдите в лист 25 - 50, где, я думаю, он будет искать по строкам данных в этом листе, пока не найдет 50-й день. Содержит ли здесь значение 50 & указатель на строку, которая содержит остальные данные в этой строке?

б-дерево

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

Date            ID  SEC ID  AutoID
10th Jan 2015   ABC A123    1
10th Jan 2015   ABC A344    2
10th Jan 2015   DEF A123    3
10th Jan 2015   GHJ A344    4
20th Feb 2015   ABC A123    5
20th Feb 2015   ABC A344    6
20th Feb 2015   DEF A123    7
20th Feb 2015   GHJ A344    8

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

Здесь я заблудился.

Как индексирование будет хранить эти данные и сможет быстро получить их, как в первом примере? Ключевое значение "10 января 2015 года ABCA123" на самом деле ничего не значит (я, вероятно, ошибочно предполагаю, что здесь происходит - я считаю, что индекс объединяет три столбца, чтобы создать уникальное значение, которое он помещает в таблицу индексов), В первом примере наше значение индекса на самом деле что-то значило для данных, то есть номер дня.

Я также не понимаю, как сервер sql будет использовать AutoID? При запросе данных выше я бы использовал столбцы Date & ID в условии where, чтобы AutoID казался бессмысленным?

1 ответ

Решение

Содержит ли здесь значение 50 & указатель на строку, которая содержит остальные данные в этой строке?

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

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

В многостолбцовом индексе, да, фактически то, что хранится в уровнях индекса, это значения из всех столбцов вместе взятых. Вот почему с многостолбцовым индексом индекс эффективен только в том случае, если для критериев поиска используются самые левые n столбцов индекса (n <= количество столбцов в индексе).

Во втором примере, если индекс определен на Date, ID а также SEC IDв этом порядке, и у вас есть запрос с WHERE пункт о ID = 'ABC' тогда индекс просто не может быть использован - потому что первая часть каждого ключа Date,

Другие вопросы по тегам