Які відмінності між a clustered
і a non-clustered index
?
Які відмінності між a clustered
і a non-clustered index
?
Відповіді:
Індекс кластера
Індекс без кластера
Обидва типи індексу покращать ефективність при виборі даних із полями, які використовують індекс, але сповільнюватимуть оновлення та вставки операцій.
Через повільніше вставляти та оновлювати кластерні індекси слід встановлювати на поле, яке зазвичай є покроковим, тобто Id або Timestamp.
Зазвичай SQL Server використовує індекс лише у тому випадку, якщо його вибірковість перевищує 95%.
Кластеризовані індекси фізично упорядковують дані на диску. Це означає, що додаткові дані не потрібні для індексу, але може бути лише один кластерний індекс (очевидно). Доступ до даних за допомогою кластерного індексу є найшвидшим.
Усі інші індекси повинні бути некластеризованими. Некластеризований індекс має дублікат даних із індексованих стовпців, упорядкованих разом із вказівниками, на фактичні рядки даних (покажчики на кластерний індекс, якщо такі є). Це означає, що доступ до даних через некластеризований індекс повинен проходити через додатковий рівень непрямості. Однак якщо ви вибираєте лише ті дані, які доступні в індексованих стовпцях, ви можете повернути ці дані безпосередньо з дублюваних даних індексу (саме тому добре вибирати лише потрібні стовпці, а не використовувати *)
Кластеризовані індекси зберігаються фізично на столі. Це означає, що вони найшвидші, і ви можете мати лише один кластерний індекс в таблиці.
Некластеризовані індекси зберігаються окремо, і їх можна мати скільки завгодно.
Найкращим варіантом є встановлення кластерного індексу на найбільш використовуваний унікальний стовпець, як правило, ПК. Ви завжди повинні мати добре вибраний кластерний індекс у своїх таблицях, якщо не є дуже вагомою причиною - не можу придумати жодного, але ей, це може бути там - бо не робити цього.
Крім цих відмінностей, ви повинні знати, що коли таблиця не кластеризована (коли в таблиці немає кластерного індексу), файли даних не мають упорядкованого порядку, і вона використовує структуру даних Heap як структуру даних.
Плюси:
Кластеризовані індекси чудово працюють для діапазонів (наприклад, виберіть * з my_table, де my_key між @min та @max)
У деяких умовах СУБД не доведеться виконувати роботу над сортуванням, якщо ви використовуєте оператор orderby.
Мінуси:
Кластеризовані індекси можуть уповільнити вставки, оскільки фізичні макети записів повинні бути змінені, оскільки записи ставляться, якщо нові клавіші не є в послідовному порядку.
Кластеризований індекс по суті є відсортованою копією даних в індексованих стовпцях.
Основна перевага кластерного індексу полягає в тому, що коли ваш запит (пошук) знаходить дані в індексі, то для отримання цих даних не потрібен додатковий IO.
Накладні витрати на підтримку кластерного індексу, особливо в часто оновлюваній таблиці, можуть призвести до низької продуктивності, і тому може бути кращим створити некластеризований індекс.
Індексована база даних складається з двох частин: набір фізичних записів, які розташовані в якомусь довільному порядку, і набір індексів, які ідентифікують послідовність, в якій записи слід читати, щоб отримати результат, відсортований за деяким критерієм. Якщо між фізичним розташуванням та індексом немає кореляції, то для зчитування всіх записів в порядку може знадобитися зробити безліч незалежних операцій з читання одного запису. Оскільки в базі даних може бути можливість читати десятки послідовних записів за менший час, ніж потрібно для читання двох непослідовних записів, продуктивність може бути покращена, якщо записи, які є послідовними в індексі, також послідовно зберігаються на диску.
Наприклад, якби почати з порожньої некластеризованої бази даних та додати 10 000 записів у випадковій послідовності, записи, ймовірно, будуть додані наприкінці в тому порядку, в який вони були додані. Для того, щоб прочитати базу даних за порядком за індексом, знадобиться 10000 прочитань на один запис. Якщо потрібно використовувати кластеризовану базу даних, однак система може перевіряти, додаючи кожен запис, чи зберігався попередній запис сам; якби він виявив, що це так, він може записати цей запис разом із новим в кінці бази даних. Тоді він міг би переглянути фізичний запис перед слотами, де переміщені записи використовувались для проживання, і побачити, чи зберігається запис, який слідує за ним. Якщо він виявить, що це так, він може перенести цей запис на те місце. Використання такого роду підходу спричинить групування багатьох записів по парах,
Насправді кластерні бази даних використовують більш складні алгоритми, ніж цей. Однак слід зазначити, що між часом, необхідним для оновлення бази даних, і часом, необхідним для послідовного його читання, існує компроміс. Підтримка кластерної бази даних значно збільшить обсяг роботи, необхідної для додавання, видалення або оновлення записів будь-яким способом, який би вплинув на послідовність сортування. Якщо база даних буде читатися послідовно набагато частіше, ніж вона буде оновлюватися, кластеризація може стати великим виграшем. Якщо він буде оновлюватися часто, але рідко читається послідовно, кластеризація може бути великим збиттям продуктивності, особливо якщо послідовність, в яку елементи додаються до бази даних, не залежить від порядку їх сортування щодо кластерного індексу.
Можливо, ви пройшли теоретичну частину з вищезгаданих дописів:
- Кластерний індекс, як ми можемо бачити точки для запису, тобто його прямий, тому для пошуку потрібно менше часу. Крім того, це не займе додаткової пам'яті / місця для зберігання індексу
-Поки в некластерному індексі він опосередковано вказує на кластерний індекс, тоді він отримає доступ до фактичного запису, через свою непряму природу знадобиться трохи більше часу, щоб отримати доступ. Так само йому потрібна власна пам'ять / простір для зберігання покажчик
// Копійований з MSDN, другий пункт некластеризованого індексу чітко не згадується в інших відповідях.
Скупчений
Некластеризований