Существует ли способ преобразовать некластеризованный индекс первичного ключа в кластеризованный? (SQL Server 2008)
С помощью Management Studio я не могу изменить индекс. Удаление его не работает, потому что он используется в качестве внешнего ключа во многих других таблицах. Могу ли я как-то изменить его? Или как бы вы это сделали?
4 ответов:
Если на ваш существующий PK ссылаются многие другие таблицы, то вы потратите много утомительных и подверженных ошибкам минут на написание сценария, чтобы удалить все ссылки FK и воссоздать их.
SQL Server Management Studioможет сделать это за вас. Возможно, вы не поняли, что в таблице может быть только один кластеризованный индекс, потому что кластеризованный индекс представляет собой физическое упорядочение строк ; это означает, что сначала нужно вызвать кластеризованный индекс и выключитекластеризацию . Тогда и только тогда вы можете вытащить другой индекс и включитьна кластеризацию.
Вам нужно сделать это из конструктора таблиц, затем щелкните правой кнопкой мыши и выберите
Indexes/Keys.... Сначала найдите существующий кластеризованный индекс (возможно, первичный ключ) и изменитеCreate as Clusteredна No. Затем перейдите к другому индексу и изменитеCreate as Clusteredна Yes для этого. Если таблица большая, операция может затянуться, пока вы экономите; вы можете обойти это, имея SSMS создайте сценарий изменения (щелкните правой кнопкой мыши на конструкторе после изменения индексов, и вы увидите опцию). Затем вы можете запустить этот скрипт в окне запроса без тайм-аута.Если вы посмотрите на этот сценарий изменений, вы увидите всю работу, которую он выполняет, создавая промежуточные таблицы и переключая ключи; это боль, чтобы написать это вручную. Пусть SSMS сделает это за вас.
Вы не можете преобразовать его на месте - сначала нужно удалить ограничение первичного ключа (которое также автоматически удалит некластеризованный индекс " за " ограничением первичного ключа), а затем повторно создать его как кластеризованный индекс:
ALTER TABLE dbo.YourTable DROP CONSTRAINT PK_YourTable, а затем воссоздать его в виде кластера:
ALTER TABLE dbo.YourTable ADD CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED (YourPKField)
Вы можете фактически изменить некластеризованный PK и сделать его кластеризованным с помощью этого синтаксиса
CREATE UNIQUE CLUSTERED INDEX [PK_Customer] on Customer(CustomerID) WITH DROP_EXISTINGСначала вам нужно очистить свои ограничения: S
Вам также придется удалить ограничения FK, изменить PK, а затем воссоздать ограничения FK после того, как новый PK будет установлен. Ограничения внешнего ключа требуют, чтобы ссылочный ключ был уникальным, первичный ключ, по определению, уникален, поэтому удаление PK не допускается, пока ограничения FK ссылаются на PK.
При переходе к кластеризованному индексу таблица перезаписывается. Каждый раз, когда я рассматриваю возможность перехода в / из кластеризованного индекса или изменения кластеризованного индекса, я бы пересмотрел его необходимость и выбор ключей для кластеризованного индекса - особенно если он не будет уникальным или увеличивающимся (как datetime для метки времени). Помните, что кластеризованный индекс на самом деле не является индексом в первую очередь - это порядок данных на страницах. Вот почему кластеризация по возрастающему ключу помогает при разбиении страниц при добавлении данных в таблицу.
Comments