Ответ
PRIMARY KEY — это логическое ограничение целостности данных, которое гарантирует уникальность и запрещает значения NULL в указанных столбцах. Кластерный индекс — это физическая структура хранения, определяющая порядок записей на диске.
Ключевые отличия:
- Назначение: PRIMARY KEY обеспечивает уникальность, кластерный индекс — физический порядок.
- Количество: В таблице может быть только один кластерный индекс, но несколько ограничений PRIMARY KEY быть не может (оно одно).
- Зависимость: PRIMARY KEY по умолчанию в SQL Server создаётся как кластерный индекс, но это поведение можно изменить.
- Столбцы: Кластерный индекс можно создать на неуникальных или допускающих 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 же выбирается исходя из бизнес-логики.