Каков лимит на количество некластеризованных индексов в таблице SQL Server и каковы практические ограничения?

«Каков лимит на количество некластеризованных индексов в таблице SQL Server и каковы практические ограничения?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Технический лимит SQL Server (начиная с версии 2016): В одной таблице можно создать до 999 некластеризованных индексов.

Пример создания некластеризованного индекса:

-- Создание некластеризованного индекса по одному столбцу
CREATE NONCLUSTERED INDEX IX_Products_Name 
ON dbo.Products (ProductName);

-- Создание составного некластеризованного индекса
CREATE NONCLUSTERED INDEX IX_Orders_Date_Customer 
ON dbo.Orders (OrderDate DESC, CustomerID);

Практические ограничения и последствия:

  • Производительность записи (INSERT, UPDATE, DELETE): Каждый индекс — это отдельная структура данных (B-дерево), которую СУБД должна поддерживать в актуальном состоянии. Большое количество индексов значительно замедляет операции модификации данных.
  • Использование дискового пространства: Некластеризованные индексы хранят копию ключевых столбцов и указатель на строку данных (ключ кластеризованного индекса или RID).
  • Планирование запросов: Оптимизатору приходится анализировать больше вариантов выполнения, что может увеличивать время компиляции запроса.

Рекомендация: Не приближаться к техническому лимиту. Создавайте индексы адресно, основываясь на анализе реальных рабочих нагрузок (sys.dm_db_index_usage_stats). Для большинства таблиц оптимально иметь 5-15 осмысленных индексов.