Всегда ли первичный ключ кластеризован?

Пожалуйста, устраните мои сомнения по этому поводу. В SQL Server (2000 и выше) первичный ключ автоматически индексируется кластером или у нас есть выбор, чтобы иметь некластеризованный индекс по первичному ключу?

Ответов (2)

Решение

Нет, он может быть некластеризованным. Однако, если вы явно не определите его как некластеризованный и в таблице нет кластерного индекса, он будет создан как кластерный.

Можно также добавить, что часто НЕПРАВИЛЬНО разрешать кластеризацию первичного ключа. В частности, когда первичный ключ назначается с помощью ИДЕНТИЧНОСТИ, он не имеет внутреннего значения, поэтому любые усилия по поддержанию соответствующей организации таблицы будут потрачены впустую.

Рассмотрим таблицу Product с ProductID INT IDENTITY PRIMARY KEY. Если это кластеризовано, то продукты, которые каким-то образом связаны, вероятно, будут распределены по всему диску. Возможно, было бы лучше выполнить кластеризацию по чему-то, на основе чего мы, вероятно, будем запрашивать, например, по ManufacturerID или CategoryID. В любом из этих случаев кластеризованный индекс (при прочих равных) сделает соответствующий запрос намного более эффективным.

С другой стороны, внешний ключ в дочерней таблице, который указывает на это, может быть хорошим кандидатом для кластеризации (я возражаю против столбца, который на самом деле имеет атрибут IDENTITY, а не его родственников). Итак, в моем примере выше, вероятно, что ManufacturerID является внешним ключом для таблицы Manufacturer, где он установлен как IDENTITY. Этот столбец не следует кластеризовать, но столбец в Product, который на него ссылается, может оказаться полезным.