По умолчанию ПК кластеризован, и в большинстве случаев это нормально. Однако, какой вопрос следует задать:
- мой ПК должен быть кластеризован?
- какой столбец (столбцы) будет лучшим ключом для моего кластерного индекса?
PK и Clustered index являются двумя отличиями:
- ПК является ограничением. PK используется для уникальной идентификации строк, но нет понятия хранения. Однако по умолчанию (в SSMS) он применяется уникальным кластерным индексом, если кластерный индекс еще не представлен.
- Кластерные индексы - это особый тип индекса, который хранит данные строк на уровне листа, то есть он всегда покрывает. Все столбцы, являются ли они частью ключа или нет, хранятся на уровне листа. Он не обязательно должен быть уникальным, и в этом случае к кластеризованному ключу добавляется уникальный код (4 байта).
Теперь у нас 2 вопроса:
- Как я хочу уникально идентифицировать строки в моей таблице (PK)
- Как я хочу сохранить его на уровне листа индекса (Clustered Index)
Это зависит от того, как:
- вы разрабатываете свою модель данных
- вы запрашиваете ваши данные, и вы пишете свои запросы
- Вы вставляете или обновляете свои данные
- ...
Во-первых, вам нужен кластерный индекс? При массовой вставке более эффективно хранить неупорядоченные данные в HEAP (по сравнению с упорядоченными данными в кластере). Он использует RID (идентификатор строки, 8 байт) для уникальной идентификации строк и сохранения их на страницах.
Кластерный индекс не должен быть случайным значением. Данные на уровне листа будут сохранены и упорядочены по ключу индекса. Поэтому он должен постоянно расти, чтобы избежать фрагментации или разбиения страницы. Если это не может быть достигнуто PK, вы должны рассмотреть другой ключ в качестве кластеризованного кандидата. Кластерный индекс для одинаковых столбцов, последовательный идентификатор GUID или даже что-то вроде даты вставки - это хорошо с последовательной точки зрения, поскольку все строки будут добавлены на последнюю конечную страницу. С другой стороны, хотя уникальный идентификатор может быть полезен для вашего бизнеса в качестве PK, их не следует кластеризовывать (они упорядочены / сгенерированы случайным образом).
Если после некоторого анализа данных и запросов вы обнаружите, что для получения данных в основном используете один и тот же индекс, прежде чем выполнять поиск ключа в кластеризованном PK, вы можете рассматривать его как кластерный индекс, хотя он может не однозначно идентифицировать ваши данные.
Ключ кластеризованного индекса состоит из всех столбцов, которые вы хотите проиндексировать. Столбец uniquefier (4 байта) добавляется, если на него нет уникального ограничения (инкрементное значение для дубликатов, в противном случае - ноль). Этот ключ индекса будет сохранен один раз для каждой строки на уровне листьев всех ваших некластеризованных индексов. Некоторые из них также будут храниться несколько раз на промежуточных уровнях (ветвях) между корнем и уровнем листьев дерева индексов (B-дерево). Если ключ слишком большой, все некластеризованные индексы станут больше, потребуется больше памяти и больше ввода-вывода, процессора, памяти, ... Если у вас есть PK на имя + дата рождения + страна, весьма вероятно, что этот ключ не хороший кандидат. Он слишком велик для кластерного индекса. Уникальный идентификатор с использованием NEWSEQUENTIALID () обычно не считается узким ключом (16 байт), хотя он является последовательным.
Затем, когда вы выяснили, как уникально идентифицировать строки в вашей таблице, вы можете добавить PK. Если вы думаете, что не будете использовать его в своем запросе, не создавайте его кластеризованно. Вы все еще можете создать другой некластеризованный индекс, если вам когда-нибудь понадобится запросить его. Обратите внимание, что ПК автоматически создаст уникальный индекс.
Некластеризованные индексы всегда будут содержать кластеризованный ключ. Однако, если индексированные столбцы (+ ключевые столбцы) покрывают, не будет никакого ключевого поиска в кластеризованном индексе. Не забывайте, что вы можете также добавить «Включить» и «Где» в некластеризованный индекс. (использовать его мудро)
Кластерный индекс должен быть уникальным и как можно более узким Кластерный индекс не должен изменяться со временем и должен добавляться постепенно.
Теперь пришло время написать некоторый SQL, который создаст таблицу, кластерные и некластеризованные индексы и ограничения.
Это все теоретически, потому что мы не знаем вашу модель данных и используемые типы данных (A и B).