Есть ли способ преобразовать некластеризованный индекс первичного ключа в кластерный? (SQL Server 2008) - PullRequest
12 голосов
/ 13 марта 2010

С Management Studio я не могу изменить индекс. Отбрасывание этого не работает, потому что он используется как внешний ключ во многих других таблицах. Могу ли я как-то изменить это? Или как бы ты это сделал?

Ответы [ 4 ]

20 голосов
/ 13 марта 2010

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

SQL Server Management Studio может сделать это за вас. Вы, возможно, не поняли, что у вас может быть только один кластеризованный индекс в таблице, потому что кластеризованный индекс представляет физический порядок строк; это означает, что сначала нужно вызвать кластеризованный индекс и отключить отключение кластеризации. Тогда и только тогда вы сможете открыть другой индекс и включить на кластеризацию.

Это необходимо сделать из дизайнера таблиц, затем щелкните правой кнопкой мыши и выберите Indexes/Keys.... Сначала найдите существующий кластеризованный индекс (возможно, первичный ключ) и измените Create as Clustered на Нет . Затем перейдите к другому индексу и замените Create as Clustered на Да . Если таблица большая, операция может истечь во время сохранения; вы можете обойти это, если SSMS сгенерирует скрипт изменения (щелкните правой кнопкой мыши конструктор после изменения индексов, и вы увидите опцию). Затем вы можете запустить этот скрипт в окне запроса без тайм-аута.

Если вы посмотрите на этот скрипт изменений, вы увидите всю работу, которую он выполняет, создавая промежуточные таблицы и переключая ключи; Больно писать это вручную. Пусть SSMS сделает это за вас.

9 голосов
/ 13 марта 2010

Вы не можете преобразовать его на месте - сначала нужно удалить ограничение первичного ключа (которое также автоматически отбросит некластеризованный индекс «за» ограничением первичного ключа), а затем заново создать его как кластерный индекс :

ALTER TABLE dbo.YourTable
DROP CONSTRAINT PK_YourTable

, а затем воссоздайте его как кластеризованный:

ALTER TABLE dbo.YourTable
ADD CONSTRAINT PK_YourTable
PRIMARY KEY CLUSTERED (YourPKField)
4 голосов
/ 13 августа 2011

На самом деле вы можете изменить некластеризованный ПК и сделать его кластеризованным с помощью этого синтаксиса

CREATE UNIQUE CLUSTERED INDEX [PK_Customer] on Customer(CustomerID) WITH DROP_EXISTING

Вы должны сначала очистить свои ограничения: S

1 голос
/ 13 марта 2010

Вам также придется удалить ограничения FK, изменить PK и затем воссоздать ограничения FK после того, как новый PK будет на месте. Ограничения внешнего ключа требуют, чтобы ссылочный ключ был уникальным, первичный ключ по определению уникален, поэтому удаление PK не допускается, пока существуют ограничения FK, ссылающиеся на PK.

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

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