Які відмінності між кластерним та некластеризованим індексом?


277

Які відмінності між a clusteredі a non-clustered index?


8
Ви можете мати лише один кластерний індекс на таблицю. Але є й багато інших відмінностей ...
Том Робінсон,

5
Кластерний індекс насправді описує порядок, в якому записи фізично зберігаються на диску, отже, причина у вас може бути лише одна. Індекс без кластеру визначає логічний порядок, який не відповідає фізичному порядку на диску.
Джош

1
Кластеризовані в основному означають, що дані перебувають у тому фізичному порядку в таблиці. Ось чому ви можете мати лише один на стіл. Без кластеру означає, що це "лише" логічний порядок.
Бірі

2
@biri що таке "логічне" замовлення? a Некластеризований індекс зберігає індексні ключі для фізичного порядку, і він зберігає вказівник на таблицю, а саме кластерний індексний ключ.
Стефанія Сторінка

Сторінка @Stephanie: логічна з точки зору таблиці. Звичайно, некластеризовані індекси впорядковуються фізично в самому індексі.
Бірі

Відповіді:


268

Індекс кластера

  • Лише один на стіл
  • Швидше читати, ніж не кластеризовано, оскільки дані фізично зберігаються в порядку індексу

Індекс без кластера

  • Можна використовувати багато разів за столом
  • Швидше для операцій вставки та оновлення, ніж кластерний індекс

Обидва типи індексу покращать ефективність при виборі даних із полями, які використовують індекс, але сповільнюватимуть оновлення та вставки операцій.

Через повільніше вставляти та оновлювати кластерні індекси слід встановлювати на поле, яке зазвичай є покроковим, тобто Id або Timestamp.

Зазвичай SQL Server використовує індекс лише у тому випадку, якщо його вибірковість перевищує 95%.


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

4
вам не потрібно дбати, що таке х. Все, що вам потрібно знати, - це те, що для програми з мільйонами користувачів x буде важливим
Pacerier

14
Це суто догма. Це не "швидше читати, тому що дані зберігаються в порядку". Це швидше читати, тому що ви уникаєте прочитаного індексу, а потім прочитаного. Швидше діапазон сканування (якщо це має сенс), оскільки дані зберігаються в порядку. тобто коефіцієнт кластеризації є ідеальним.
Стефанія Сторінка

6
Також ідея, що 95% записів повинні бути унікальними, є помилкою. Скажімо, у вас таблиця з 1 000 000 рядків, а ви індексуєте стовпчик з 500 000 ключів. 0% унікальні, але кожен ключ повертає 2 з мільйона рядків. Цей індекс абсолютно корисний незалежно від того, що 0% записів є унікальними.
Стефанія Сторінка

2
"дані фізично зберігаються в порядку індексу", що ви розумієте під цим? На одному рівні це тривіально вірно, тому що сторінки даних та сторінки вказівного аркуша є одними і тими ж, тому очевидно впорядкування однієї описує впорядкування іншого. Однак це не обов'язково в якомусь конкретному порядку, наприклад, вказівник ключа stackoverflow.com/questions/1251636/…
Мартін Сміт

79

Кластеризовані індекси фізично упорядковують дані на диску. Це означає, що додаткові дані не потрібні для індексу, але може бути лише один кластерний індекс (очевидно). Доступ до даних за допомогою кластерного індексу є найшвидшим.

Усі інші індекси повинні бути некластеризованими. Некластеризований індекс має дублікат даних із індексованих стовпців, упорядкованих разом із вказівниками, на фактичні рядки даних (покажчики на кластерний індекс, якщо такі є). Це означає, що доступ до даних через некластеризований індекс повинен проходити через додатковий рівень непрямості. Однак якщо ви вибираєте лише ті дані, які доступні в індексованих стовпцях, ви можете повернути ці дані безпосередньо з дублюваних даних індексу (саме тому добре вибирати лише потрібні стовпці, а не використовувати *)


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

34

Кластеризовані індекси зберігаються фізично на столі. Це означає, що вони найшвидші, і ви можете мати лише один кластерний індекс в таблиці.

Некластеризовані індекси зберігаються окремо, і їх можна мати скільки завгодно.

Найкращим варіантом є встановлення кластерного індексу на найбільш використовуваний унікальний стовпець, як правило, ПК. Ви завжди повинні мати добре вибраний кластерний індекс у своїх таблицях, якщо не є дуже вагомою причиною - не можу придумати жодного, але ей, це може бути там - бо не робити цього.


3
чи можете ви детальніше розповісти про те, "у нас завжди повинен бути кластерний індекс у наших таблицях"? без уточнення це твердження просто неправильне, оскільки слово завжди
Pacerier

1
Ти маєш рацію Pacerier, не слід з легкістю використовувати абсолютні твердження. Хоча я не знаю жодного випадку, коли у вас не повинно бути добре вибраного кластерного індексу, такий випадок може існувати, тому я змінив свою відповідь на більш загальну версію.
Сантьяго Кепас

28

Індекс кластера

  1. Для таблиці може бути лише один кластерний індекс.
  2. Зазвичай робиться на первинному ключі.
  3. Вузли листів кластерного індексу містять сторінки даних.

Індекс без кластеру

  1. Для таблиці може бути лише 249 некластеризованих індексів (до sql версії 2005 р. Більш пізні версії підтримують до 999 некластеризованих індексів).
  2. Зазвичай робиться на будь-якому ключі.
  3. Вузол листя некластеризованого індексу не складається із сторінок даних. Натомість вузли листя містять рядки вказівника.

24

Індекс кластера

  • У таблиці може бути лише один кластерний індекс
  • Сортуйте записи та зберігайте їх фізично відповідно до порядку
  • Отримання даних швидше, ніж некластеризовані індекси
  • Не потрібно додаткового місця для зберігання логічної структури

Індекс без кластера

  • У таблиці може бути будь-яка кількість некластеризованих індексів
  • Не впливають на фізичний порядок. Створіть логічний порядок для рядків даних та використовуйте покажчики на фізичні файли даних
  • Введення / оновлення даних швидше, ніж кластерний індекс
  • Використовуйте додатковий простір для зберігання логічної структури

Крім цих відмінностей, ви повинні знати, що коли таблиця не кластеризована (коли в таблиці немає кластерного індексу), файли даних не мають упорядкованого порядку, і вона використовує структуру даних Heap як структуру даних.


10

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

Без кластеру означає, що це "лише" логічне замовлення.


9

Плюси:

Кластеризовані індекси чудово працюють для діапазонів (наприклад, виберіть * з my_table, де my_key між @min та @max)

У деяких умовах СУБД не доведеться виконувати роботу над сортуванням, якщо ви використовуєте оператор orderby.

Мінуси:

Кластеризовані індекси можуть уповільнити вставки, оскільки фізичні макети записів повинні бути змінені, оскільки записи ставляться, якщо нові клавіші не є в послідовному порядку.


6

Кластеризований індекс по суті є відсортованою копією даних в індексованих стовпцях.

Основна перевага кластерного індексу полягає в тому, що коли ваш запит (пошук) знаходить дані в індексі, то для отримання цих даних не потрібен додатковий IO.

Накладні витрати на підтримку кластерного індексу, особливо в часто оновлюваній таблиці, можуть призвести до низької продуктивності, і тому може бути кращим створити некластеризований індекс.


6

Індексована база даних складається з двох частин: набір фізичних записів, які розташовані в якомусь довільному порядку, і набір індексів, які ідентифікують послідовність, в якій записи слід читати, щоб отримати результат, відсортований за деяким критерієм. Якщо між фізичним розташуванням та індексом немає кореляції, то для зчитування всіх записів в порядку може знадобитися зробити безліч незалежних операцій з читання одного запису. Оскільки в базі даних може бути можливість читати десятки послідовних записів за менший час, ніж потрібно для читання двох непослідовних записів, продуктивність може бути покращена, якщо записи, які є послідовними в індексі, також послідовно зберігаються на диску.

Наприклад, якби почати з порожньої некластеризованої бази даних та додати 10 000 записів у випадковій послідовності, записи, ймовірно, будуть додані наприкінці в тому порядку, в який вони були додані. Для того, щоб прочитати базу даних за порядком за індексом, знадобиться 10000 прочитань на один запис. Якщо потрібно використовувати кластеризовану базу даних, однак система може перевіряти, додаючи кожен запис, чи зберігався попередній запис сам; якби він виявив, що це так, він може записати цей запис разом із новим в кінці бази даних. Тоді він міг би переглянути фізичний запис перед слотами, де переміщені записи використовувались для проживання, і побачити, чи зберігається запис, який слідує за ним. Якщо він виявить, що це так, він може перенести цей запис на те місце. Використання такого роду підходу спричинить групування багатьох записів по парах,

Насправді кластерні бази даних використовують більш складні алгоритми, ніж цей. Однак слід зазначити, що між часом, необхідним для оновлення бази даних, і часом, необхідним для послідовного його читання, існує компроміс. Підтримка кластерної бази даних значно збільшить обсяг роботи, необхідної для додавання, видалення або оновлення записів будь-яким способом, який би вплинув на послідовність сортування. Якщо база даних буде читатися послідовно набагато частіше, ніж вона буде оновлюватися, кластеризація може стати великим виграшем. Якщо він буде оновлюватися часто, але рідко читається послідовно, кластеризація може бути великим збиттям продуктивності, особливо якщо послідовність, в яку елементи додаються до бази даних, не залежить від порядку їх сортування щодо кластерного індексу.


5

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

Індекс без кластеру визначає логічний порядок, який не відповідає фізичному порядку на диску.


2

Можливо, ви пройшли теоретичну частину з вищезгаданих дописів:

- Кластерний індекс, як ми можемо бачити точки для запису, тобто його прямий, тому для пошуку потрібно менше часу. Крім того, це не займе додаткової пам'яті / місця для зберігання індексу

-Поки в некластерному індексі він опосередковано вказує на кластерний індекс, тоді він отримає доступ до фактичного запису, через свою непряму природу знадобиться трохи більше часу, щоб отримати доступ. Так само йому потрібна власна пам'ять / простір для зберігання покажчик

введіть тут опис зображення


0

// Копійований з MSDN, другий пункт некластеризованого індексу чітко не згадується в інших відповідях.

Скупчений

  • Кластеризовані індекси сортують і зберігають рядки даних у таблиці або перегляді на основі їх ключових значень. Це стовпці, що входять до визначення індексу. В таблиці може бути лише один кластерний індекс, оскільки самі рядки даних можуть зберігатися лише в одному порядку.
  • Єдиний раз, коли рядки даних у таблиці зберігаються у відсортованому порядку, це коли таблиця містить кластерний індекс. Коли таблиця має кластерний індекс, таблиця називається кластерною таблицею. Якщо таблиця не має кластерного індексу, її рядки даних зберігаються у не упорядкованій структурі, що називається купою.

Некластеризований

  • Некластеризовані індекси мають структуру, окрему від рядків даних. Некластеризований індекс містить некластеризовані ключові значення індексу, і
    кожен запис значення ключа має вказівник на рядок даних, який містить ключове значення.
  • Вказівник від індексного рядка в некластеризованому індексі до рядка даних називається локатором рядків. Структура локатора рядків залежить від того, зберігаються сторінки даних у купі або кластерній таблиці. Для купи локатор рядків - це вказівник на рядок. Для кластерної таблиці локатор рядків - це кластерний індексний ключ.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.