Ответ
Кластерный индекс определяет физический порядок хранения строк данных на диске. Данные в таблице могут быть отсортированы только одним способом, поэтому второй кластерный индекс невозможен.
Причины:
- Физическое хранение: Данные хранятся в виде B-дерева, где листовые узлы — это сами строки таблицы. Нельзя одновременно хранить строки в двух разных физических порядках.
- Накладные расходы: Создание второго кластерного индекса потребовало бы полного дублирования всех данных таблицы в другом порядке, что резко увеличило бы:
- Объём хранилища.
- Время на операции вставки/обновления/удаления (поддержание двух копий).
Пример (SQL Server):
-- Создание кластерного индекса (определяет порядок хранения по OrderID)
CREATE CLUSTERED INDEX IX_Orders_OrderID ON Orders(OrderID);
-- Попытка создать второй кластерный индекс вызовет ошибку
-- Msg 1902: Для таблицы может быть создан только один кластерный индекс.
CREATE CLUSTERED INDEX IX_Orders_CustomerID ON Orders(CustomerID); -- ОШИБКА
Альтернатива: Для других колонок создавайте некластерные индексы. Они хранят только ключевые значения и указатели на данные, не переупорядочивая саму таблицу.
-- Некластерный индекс по CustomerID допустим
CREATE NONCLUSTERED INDEX IX_Orders_CustomerID ON Orders(CustomerID);