SQL Server - Коли використовувати індекс з кластером Clustered vs?


99

Я знаю первинні відмінності між кластерними та не кластерними індексами і розумію, як вони насправді працюють. Я розумію, як кластерні та некластеризовані індекси покращують ефективність читання. Але я не впевнений у тому, що в тому, що було б причиною, коли я вибирав би одне над іншим.

Наприклад: Якщо таблиця не має кластерного індексу, чи слід створити некластеризований індекс і яку користь робити


3
Дякуємо за відповідь. Я це вже знаю. Моє запитання: чи буде ситуація, коли створення
некластеризованого

2
Так, слід уникати кластерного індексу, коли; стовпець має низьку кардинальність, немає конкретного порядку, часто оновлюється, не є послідовним, це складова багатьох колонок ...
TI

Дякую за вашу відповідь. Її корисно
армулятор

1
Можливо, це питання допоможе вам: stackoverflow.com/questions/5070529/…
Девід Гарсія Гонсалес

Відповіді:


117

Я просто хочу сказати застереження: будь ласка, дуже обережно підберіть ваш кластерний індекс! Кожна "звичайна" таблиця даних повинна мати кластерний індекс, оскільки наявність кластерного індексу дійсно прискорює багато операцій - так, пришвидшити , навіть вставити та видалити! Але тільки якщо ви вибрали хороший кластерний індекс.

Це найбільш реплікувана структура даних у вашій базі даних SQL Server. Ключ кластеризації також буде частиною кожного некластеризованого індексу вашої таблиці.

Ви повинні бути обережними, підбираючи кластерний ключ - це повинно бути:

  • вузький (4 байти ідеально)

  • унікальний (це "покажчик рядка" врешті-решт. Якщо ви не зробите його унікальним, SQL Server зробить це за вас у фоновому режимі, коштуючи вам пару байтів за кожен запис раз у кількість рядків та кількість некластеризованих індексів у вас є - це може бути дуже дорого!)

  • статичний (ніколи не змінюйте - якщо можливо)

  • в ідеалі постійно зростаючий, щоб ви не закінчилися жахливою фрагментацією індексу (GUID - це суцільна протилежність хорошого кластерного ключа - саме з цієї причини)

  • вона повинна бути нерегульованою, а в ідеалі також фіксованою шириною - a varchar(250)робить дуже поганий кластерний ключ

Все, що насправді повинно бути другим та третім рівнем важливості за цими пунктами ....

Перегляньте кілька публікацій блогу Кімберлі Тріпп ( Королева індексації ) на цю тему - все, що вона написала у своєму блозі, абсолютно безцінне - прочитайте, перекажіть - живіть цим!


1
Дякую marc_s за чітке пояснення. Але технічно кажучи, що non clusteredіндекс робить для нас. яке його значення ..?
hud

@nad: добре обраний некластеризований індекс може прискорити пошук - замість того, щоб порівнювати потенційно мільйони рядків даних із вашими критеріями пошуку, ви можете знайти заданий рядок із лише 4, 5 порівняннями. Це робить величезну різницю!
marc_s

1
@MuriloKunze: прочитайте допис у блозі Кіма Триппа на цю тему - вона дуже докладно пояснює, чому це так
marc_s

5
Вибачте, але де відповідь на питання "SQL Server - коли використовувати індекс з кластерним кластером?" ?
Едуард
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.