Чем отличаются два метода генерации первичных ключей кластера? - PullRequest
1 голос
/ 23 мая 2019

У меня есть таблица для создания кластерного первичного ключа.

  CREATE TABLE dbo.SampleTable
  (
   C1 INT NOT NULL,
   C2 INT NOT NULL )

Первый способ - создание индекса первичного ключа с кластеризованным индексом.

ALTER TABLE dbo.SampleTable ADD CONSTRAINT IDX_SampleTable PRIMARY KEY CLUSTERED (C1, C2)

Второй путь - CREATE CLUSTERED INDEX послеADD CONSTRAINT PRIMARY KEY NONCLUSTERED о тех же столбцах.

ALTER TABLE dbo.SampleTable ADD CONSTRAINT IDX_SampleTable PRIMARY KEY NONCLUSTERED (C1, C2)
CREATE CLUSTERED INDEX IDX_SampleTable2 ON dbo.SampleTable (C1 ,C2)    -- Can not create Same Name With above Constraint Name

Есть ли разница в производительности по сравнению с двумя вышеупомянутыми методами?Есть ли способ не рекомендует его использовать?

Ответы [ 3 ]

1 голос
/ 23 мая 2019

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

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

Во втором примере вы НЕ применяете это поведение CLUSTERED через первичный ключ, но через отдельный индекс. Хотя теперь эффекты остались прежними, вы можете удалить (или временно отключить) индекс, и тогда данные больше не будут гарантированно храниться CLUSTERED.

Итог: на практике эти два утверждения сейчас одинаковы, но могут иметь значение в будущем, поскольку свойство CLUSTERED не интегрировано в PK, а в отдельный индекс.

0 голосов
/ 23 мая 2019

Создание некластеризованного первичного ключа, а затем создание кластеризованного индекса для столбцов в первичном ключе не является хорошей идеей. Фактически вы создадите 2 индекса для столбцов (C1 и C2 в данном случае), однако, очень маловероятно, что некластеризованный индекс когда-либо будет использоваться. Это связано с тем, что кластерный индекс, скорее всего, станет первым выбором для СУБД, поскольку страницы будут в порядке кластерного индекса. Кроме того, при использовании некластеризованного индекса механизму данных все равно потребуется впоследствии обращаться к кластерному индексу, чтобы выяснить точное местоположение строки (на страницах).

Если вам нужен кластерный индекс для ваших первичных ключей, то создайте ключ как кластерный первичный ключ. Это не означает, что ваш Первичный ключ всегда должен быть кластеризованным, но это совсем другой предмет.

0 голосов
/ 23 мая 2019

Это зависит от ваших данных:

https://docs.microsoft.com/en-gb/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view=sql-server-2017

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

Таким образом, кластеризованный ключ влияет на формат вашей физической структуры данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...