У вас есть несколько вопросов. Я сломаю некоторые из них:
При создании индексов, почему я должен заботиться о кластеризованных и некластеризованных?
Иногда вас волнует, как организованы строки. Это зависит от ваших данных и того, как вы будете их использовать. Например, если ваш первичный ключ - uniqueidentifier
, вы, возможно, не захотите, чтобы он был CLUSTERED
, поскольку значения GUID по существу случайны. Это приведет к тому, что SQL будет случайным образом вставлять строки в таблицу, что приведет к разбиению страниц, что снизит производительность. Если значение вашего первичного ключа всегда будет последовательно увеличиваться (например, int IDENTITY
), то вы, вероятно, захотите, чтобы оно было CLUSTERED
, поэтому ваша таблица всегда будет расти в конце.
По умолчанию используется первичный ключ CLUSTERED
, и в большинстве случаев вам не нужно об этом беспокоиться.
Мне сказали, что вставка и удаление медленны с некластеризованными индексами, поскольку дерево необходимо «перестроить». Я так понимаю, кластерные индексы не влияют на производительность таким образом?
На самом деле, обратное может быть правдой. Индексы NONCLUSTERED
хранятся в виде отдельной структуры данных, но структура разработана таким образом, чтобы можно было вносить некоторые изменения без необходимости «перестроения». Когда индекс создается изначально, вы можете указать FILLFACTOR
, который указывает, сколько свободного места оставить на каждой странице индекса. Это позволяет индексу терпеть некоторые изменения, прежде чем разделение страницы необходимо. Даже если разделение страниц должно произойти, оно влияет только на соседние страницы, а не на весь индекс.
То же самое относится к CLUSTERED
индексам, но поскольку CLUSTERED
индексы хранят фактические данные таблицы, операции разбиения страницы в индексе могут быть намного более дорогостоящими, поскольку может потребоваться перемещение всей строки (по сравнению только с ключом столбцы и ROWID
в индексе NONCLUSTERED
.
На следующей странице MSDN говорится о FILLFACTOR
и разбиениях страницы:
http://msdn.microsoft.com/en-us/library/aa933139(SQL.80).aspx
Что особенного в первичном ключе по сравнению с кластеризованным уникальным индексом?
Чем отличаются ограничения для индексов?
Для обоих из них я думаю, что это больше о декларации ваших намерений. Когда вы называете что-то PRIMARY KEY
, вы заявляете, что это основной метод идентификации данной строки. PRIMARY KEY
физически отличается от CLUSTERED UNIQUE INDEX
? Я не уверен. Поведение в основном такое же, но ваши намерения могут быть неясны для кого-то, работающего с вашей базой данных.
Что касается ограничений, существует много типов ограничений. Для UNIQUE CONSTRAINT
, на самом деле нет разницы между этим и UNIQUE INDEX
, кроме объявления вашего намерения. Существуют другие типы ограничений, которые не отображаются непосредственно на тип индекса, такие как CHECK
ограничения, DEFAULT
ограничения и FOREIGN KEY
ограничения.