В чём разница между кластерным индексом и PRIMARY KEY в SQL?

«В чём разница между кластерным индексом и PRIMARY KEY в SQL?» — вопрос из категории Базы данных, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

PRIMARY KEY — это логическое ограничение целостности данных, которое гарантирует уникальность и запрещает значения NULL в указанных столбцах. Кластерный индекс — это физическая структура хранения, определяющая порядок записей на диске.

Ключевые отличия:

  1. Назначение: PRIMARY KEY обеспечивает уникальность, кластерный индекс — физический порядок.
  2. Количество: В таблице может быть только один кластерный индекс, но несколько ограничений PRIMARY KEY быть не может (оно одно).
  3. Зависимость: PRIMARY KEY по умолчанию в SQL Server создаётся как кластерный индекс, но это поведение можно изменить.
  4. Столбцы: Кластерный индекс можно создать на неуникальных или допускающих NULL столбцах (с добавлением уникафикатора), что для PRIMARY KEY недопустимо.

Практический пример разделения:

-- PRIMARY KEY как некластеризованный индекс, а кластеризация по другому полю
CREATE TABLE Orders (
    OrderID INT NOT NULL,
    OrderDate DATETIME NOT NULL,
    CustomerID INT NOT NULL,
    -- Логический первичный ключ (уникальный, не NULL)
    CONSTRAINT PK_Orders PRIMARY KEY NONCLUSTERED (OrderID)
);
-- Физический порядок хранения по дате заказа (частый запрос по диапазону дат)
CREATE CLUSTERED INDEX IX_Orders_OrderDate ON Orders(OrderDate);

Почему это важно? Выбор кластерного ключа критически влияет на производительность операций вставки и диапазонных запросов (WHERE BETWEEN, ORDER BY). Часто оптимальный кластерный ключ — монотонно возрастающий (например, IDENTITY), чтобы избежать фрагментации страниц. PRIMARY KEY же выбирается исходя из бизнес-логики.