За замовчуванням ПК є кластеризованим і в більшості випадків це нормально. Однак яке питання слід задати:
- чи повинен мій ПК бути кластеризованим?
- який стовпець буде найкращим ключем для мого кластерного індексу?
PK та Clustered index - це дві різниці:
- ПК - обмеження. ПК використовується для однозначної ідентифікації рядків, але поняття зберігання не існує. Однак за замовчуванням (у SSMS) він застосовується за допомогою унікального кластерного індексу, якщо кластерного індексу ще немає.
- Кластеризовані індекси - це особливий тип індексу, який зберігає дані про рядки на рівні листя, тобто він завжди охоплює. Усі стовпці, чи є вони частиною ключа, чи ні, зберігаються на рівні аркушів. Він не повинен бути унікальним, і в цьому випадку в кластеризований ключ додається уніфікатор (4 байти).
Тепер ми закінчуємо 2 питання:
- Як я хочу однозначно ідентифікувати рядки в моїй таблиці (ПК)
- Як я хочу зберегти його на рівні аркушів індексу (кластерний індекс)
Це залежить від того, як:
- Ви розробляєте свою модель даних
- ви запитуєте свої дані і пишете запити
- ви вставляєте або оновлюєте свої дані
- ...
По-перше, чи потрібен кластерний індекс? Якщо ви вставляєте групу, то ефективніше зберігати не упорядковані дані в HEAP (проти впорядкованих даних у кластері). Він використовує RID (ідентифікатор рядків, 8 байт), щоб однозначно ідентифікувати рядки та зберігати їх на сторінках.
Кластерний індекс не повинен бути випадковим значенням. Дані на рівні аркуша зберігатимуться та упорядковуються за допомогою індексного ключа. Тому він повинен постійно зростати, щоб уникнути фрагментації або розбиття сторінки. Якщо ПК не може досягти цього, слід розглянути ще один ключ як кластеризований кандидат. Кластеризований індекс на стовпчиках ідентичності, послідовний GUID або навіть щось на кшталт дати вставки є добре з послідовного погляду, оскільки всі рядки будуть додані на останню сторінку сторінки. З іншого боку, хоча унікальний ідентифікатор може бути корисним для ваших потреб бізнесу як ПК, вони не повинні кластеризуватися (вони довільно впорядковуються / генеруються).
Якщо після аналізу даних і запитів ви дізнаєтесь, що для отримання даних ви в основному використовуєте один і той же індекс, перш ніж здійснити пошук ключів у кластеризованому ПК, ви можете розглянути це як кластерний індекс, хоча він не може однозначно ідентифікувати ваші дані.
Кластерний ключ індексу складається з усіх стовпців, які потрібно індексувати. Стовпчик унікального коду (4 байти) додається, якщо на ньому немає унікального обмеження (додаткове значення для дублікатів, нульове інакше). Цей індексний ключ буде зберігатися один раз для кожного рядка на рівні аркуша всіх ваших некластеризованих індексів. Деякі з них також будуть зберігатися кілька разів на проміжних рівнях (гілках) між коренем та рівнем листя дерева індексу (B-дерево). Якщо ключ занадто великий, весь некластеризований індекс збільшиться, зажадає більше пам’яті та більше IO, процесора, пам’яті,… Якщо у вас є ПК на ім’я + дата народження + країна, велика ймовірність, що цей ключ не є хорошим кандидатом. Він занадто великий для кластерного індексу. Унікальний ідентифікатор, що використовує NEWSEQUENTIALID (), зазвичай не розглядається як вузький ключ (16 байт), хоча є послідовним.
Потім, коли ви зрозуміли, як однозначно ідентифікувати рядки в таблиці, ви можете додати ПК. Якщо ви думаєте, що не будете використовувати його у своєму запиті, не створюйте його в кластері. Ви все ще можете створити інший некластеризований індекс, якщо вам потрібен запит. Зауважте, що ПК автоматично створить унікальний індекс.
Некластерні індекси завжди будуть містити кластерний ключ. Однак, якщо індексовані стовпці (+ ключові стовпці) охоплюють, пошук кластера в кластерному індексі не буде. Не забувайте, що ви також можете додавати включення та де до некластеризованого індексу. (розумно використовуйте)
Кластерний індекс повинен бути унікальним і максимально вузьким. Кластеризований індекс не повинен змінюватися з часом і повинен вставлятися поступово.
Настав час написати деякий SQL, який створить таблицю, кластеризовані та некластеризовані індекси та обмеження.
Це все теоретично, оскільки ми не знаємо вашої моделі даних та використовуваних типів даних (A і B).