Понимание структуры первичного ключа по нескольким столбцам
Я пытаюсь понять, как индексация в 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
,