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

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

Насколько я понимаю, структура 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 и указатель на строку, содержащую остальные данные в этой строке?

b-дерево

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

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 столбца для создания первичного ключа (естественного ключа), или люди упомянули об использовании столбца идентификаторов, то есть суррогатного ключа.

Здесь я теряюсь.

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

Я также не понимаю, как sql-сервер будет использовать AutoID? При запросе данных выше я бы использовал столбцы «Дата и идентификатор» в условии «где», поэтому AutoID кажется бессмысленным?


person mHelpMe    schedule 25.08.2015    source источник
comment
Это напоминает мне об этом stackoverflow.com/q/32182339/5089204   -  person Shnugo    schedule 25.08.2015
comment
Да, ответ на этот вопрос помог мне принять решение использовать три столбца для моего первичного ключа. Здесь я пытаюсь понять, что происходит, т.е. как хранятся данные.   -  person mHelpMe    schedule 25.08.2015
comment
@mxix - ерунда. Первичный ключ — это уникальное ограничение, которое не допускает пустых значений. По умолчанию первичным ключом также будет кластеризованный индекс, но это только значение по умолчанию. Нет требования, чтобы PK был кластеризованным индексом.   -  person Damien_The_Unbeliever    schedule 25.08.2015


Ответы (1)


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

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

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

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

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

person Damien_The_Unbeliever    schedule 25.08.2015
comment
Лист содержит полные данные строки для кластеризованных индексов. Таким образом, узлы, которые он использует для поиска, чтобы найти лист, являются значениями индекса (скажем, мы использовали первичный ключ, который оказался номером паспорта, узлы будут содержать номер паспорта, чтобы помочь найти правильный лист, а затем получить все данные, связанные с этой строкой?) - person mHelpMe; 25.08.2015
comment
Также в многоколоночном индексе все значения объединены в одну строку или это три отдельных значения, но при поиске он знает, что нужно проверить три значения, начиная с даты, идентификатора и идентификатора SEC в моем случае? Я так понимаю, если у меня есть предложение where, в котором я использую дату и идентификатор (в таком порядке и не используя идентификатор SEC), он все равно сможет использовать мой индекс? - person mHelpMe; 25.08.2015