Ответ
Кластерный индекс определяет физический порядок хранения строк данных в таблице. Таблица может иметь только один кластерный индекс, так как данные не могут быть физически упорядочены более чем одним способом.
Ключевые особенности:
- Физическое упорядочивание: Строки в таблице хранятся на диске в порядке, заданном ключом кластерного индекса.
- Первичный ключ: В SQL Server и некоторых других СУБД создание первичного ключа (PRIMARY KEY) по умолчанию приводит к созданию кластерного индекса, если он еще не существует.
- Скорость запросов: Запросы, использующие диапазон значений по ключу кластерного индекса (
WHERE id BETWEEN 10 AND 100), выполняются очень быстро, так как данные физически расположены рядом.
Пример создания в SQL Server:
-- Создание таблицы с кластерным индексом по полю OrderID
CREATE TABLE Orders (
OrderID INT NOT NULL PRIMARY KEY CLUSTERED, -- PRIMARY KEY создает кластерный индекс
CustomerID INT,
OrderDate DATETIME
);
-- ИЛИ явное создание после создания таблицы
CREATE CLUSTERED INDEX IX_Orders_OrderDate ON Orders(OrderDate);
| Сравнение с некластерным индексом: | Аспект | Кластерный индекс | Некластерный индекс |
|---|---|---|---|
| Количество | Один на таблицу | Много на таблицу | |
| Содержимое | Содержит сами данные таблицы | Содержит ключ + указатель на строку данных | |
| Скорость выборки | Максимальная для диапазонных запросов | Быстрее, чем полное сканирование, но медленнее кластерного | |
| Влияние на INSERT/UPDATE | Может быть медленнее, так как требует переупорядочивания данных | Обычно быстрее, так как обновляется только структура индекса |
Практические рекомендации:
- Выбирайте для кластеризации столбец, который часто используется в запросах диапазонов (
BETWEEN,>,<) илиORDER BY. - Хорошие кандидаты: монотонно возрастающие ключи (например,
IDENTITY), часто используемые в соединениях. - Избегайте кластеризации по часто изменяемым столбцам или столбцам с большим размером, так как это приведет к постоянной физической реорганизации данных (фрагментации).