Первичным ключом является bigint и identity, любые причины для предпочтения некластерного индекса над кластерным индексом - PullRequest
1 голос
/ 19 июля 2011

У меня есть таблица, которая определена следующим образом

CREATE TABLE [dbo].[MyTable](
    [MyTableId] [bigint] IDENTITY(1,1) NOT NULL,
    [SomeTable2Id] [bigint] NOT NULL,
    [SomeTable3Id] [bigint] NOT NULL,
    [SomeData] [smallint] NOT NULL,
 CONSTRAINT [PK_MyTable] PRIMARY KEY NONCLUSTERED 
(
    [MyTableId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]

Помимо вышеуказанного индекса PK_MyTable NONCLUSTERED, у меня есть несколько других индексов NONCLUSTERED, кроме SomeTable2Id и SomeTable3Id

Я думаю, что создаю CLUSTEREDИндекс выше имеет больше смысла, но мне интересно, есть ли хорошее обоснование НЕ создавать индекс CLUSTERED и вместо этого создавать NONCLUSTERED?

PS По этим темам задано много вопросов, но не удалось найти соответствующую (в топ-20 списка).Если это было задано, пожалуйста, перенаправьте меня на соответствующий вопрос пост.

РЕДАКТИРОВАТЬ: рассмотрим случай, когда MyTable отображает две другие таблицы SomeTable2 и SomeTable3, и вместо составного ключа у нас есть MyTableId Так что большую часть времени мои запросы имеют либо SomeTable2Id или SomeTable3Id и запросить другой идентификатор.Таким образом, в свете использования этой таблицы, нам действительно нужно беспокоиться о создании кластеризованного индекса по MyTableId или двух некластеризованных индексов по SomeTable2Id и SomeTable3Id достаточно?

Ответы [ 2 ]

4 голосов
/ 19 июля 2011

Нет, у вас определенно должен быть кластерный индекс. Это поле Identity также является идеальным ключом кластера.

Вот несколько хороших статей Ким Триппа о кластерных индексах:

Дебаты по кластерным индексам

Дебаты по кластерным индексам продолжаются

Вот официальный документ MS по этой теме.

1 голос
/ 15 октября 2011

Я думаю, что вы определенно должны иметь MyTableId в качестве ключа в кластеризованном индексе без дополнительной информации о том, как на самом деле используется таблица.

Помните, вы выбираете между таблицей, являющейся кластерным индексом или кучей,Кластерный индекс не является индексом таблицы, но определяет, что таблица хранится в B-дереве на основе ключа кластеризованного индекса.

В обоих типах таблиц также можно использовать некластеризованные индексы..

Для производительности чтения (особенно для более широких таблиц) некластеризованные индексы (возможно, с включенными столбцами) будут именно там, где вы ищете выгоды.

...