Питання не в тому, «коли PK повинен бути NC», а натомість слід запитати «що є правильним ключем для кластерного індексу»?
І відповідь дійсно залежить від того, як ви запитуєте дані . Кластеризований індекс має перевагу перед усіма іншими індексами: оскільки він завжди включає всі стовпці, завжди охоплює. Тому запити, які можуть використовувати кластерний індекс, звичайно, не потребують пошуку для задоволення деяких проектованих стовпців та / або предикатів.
Ще один фрагмент головоломки - як можна використовувати індекс ? Існує три типові схеми:
- зонди, коли в індексі шукається значення одного ключа
- сканування діапазону, коли знайдено діапазон ключових значень
- замовлення за вимогами, коли індекс може задовольнити замовлення, не вимагаючи сортування зупинки та руху
Отже, якщо ви проаналізуєте очікуване навантаження (запити) і виявите, що велика кількість запитів використовує певний індекс, оскільки вони використовують певну схему доступу, яка отримує користь від індексу, має сенс запропонувати цей індекс як кластерний індекс.
Ще один фактор полягає в тому, що кластерний індексний ключ - це ключ пошуку, який використовується всіма некластеризованими індексами, і тому широкий кластерний індексний ключ створює ефект пульсації та розширює всі некластеризовані індекси, а широкі індекси означають більше сторінок, більше вводу / виводу , більше пам’яті, менше добра.
Хороший кластерний індекс стабільний , він не змінюється протягом життя сутності, оскільки зміна кластерних значень ключових індексів означає, що рядок потрібно видалити та вставити назад.
І хороший кластерний індекс зростає, щоб не випадковим чином (кожне нещодавно вставлене значення ключа більше попереднього значення), щоб уникнути розбиття сторінок і фрагментації (без плутанини з FILLFACTOR
s).
Отже, тепер, коли ми знаємо, що таке хороший кластерний індексний ключ, чи відповідає первинний ключ (який є логічною властивістю моделювання даних) вимогам? Якщо так, то ПК слід кластеризувати. Якщо ні, то ПК має бути некластеризованим.
Для прикладу розглянемо таблицю фактів продажів. Кожен запис має ідентифікатор, який є первинним ключем. Але переважна більшість запитів запитує дані між датою та іншою датою, тому найкращим кластеризованим індексним ключем буде дата продажу , а не ідентифікатор . Інший приклад наявності індексованого кластерного індексу від первинного ключа - це дуже низький селективний ключ, наприклад, "категорія" або "стан", ключ із лише дуже маленькими чіткими значеннями. Якщо кластерний індексний ключ із цією клавішею низької селективності є крайньою лівою клавішею, наприклад (state, id)
, часто має сенс через сканування діапазонів, які шукають усі записи у певному "стані".
Останнє зауваження про можливість некластеризованого первинного ключа над групою (тобто кластерного індексу взагалі немає). Це може бути вірним сценарієм, типовою причиною є те, коли продуктивність об'ємної вставки є критичною, оскільки купи мають значно кращу пропускну здатність масової вставки порівняно з кластерними індексами.