web-dev-qa-db-ja.com

主キーを削除せずにクラスター化インデックスを変更する

以前は、datetimecreatedをテーブルの不適切なクラスター化インデックスとして選択しました。

今度は(実行プランに基づいて)ID identity主キーを外部キーとして頻繁に参照されるため、クラスター化されたキーとして選択する方がよいと結論しました。

現在のクラスター化キーを削除して新しいキーを作成したいのですが、full-textインデックスがその主キーに依存しているため、主キーを削除できません。

主キーをクラスター化インデックスに切り替えるだけですか、それとも主キーとすべての依存オブジェクトのチェーンを削除する必要がありますか?

以下に、テーブル定義とクラスター化インデックス定義があります。

CREATE TABLE [dbo].[Realty](
    [Id] [int] IDENTITY(1,1) NOT NULL,  
    [Created] [datetime] NOT NULL,
    ....

 CONSTRAINT [PK_Realty] PRIMARY KEY NONCLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
...


CREATE CLUSTERED INDEX [Created] ON [dbo].[Realty]
(
    [Created] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
GO
6
Tomas Kubes

既存のクラスター化インデックスを削除してから、ID列に新しいインデックスを作成します。

_DROP INDEX [Created] ON dbo.Realty;
GO

CREATE UNIQUE CLUSTERED INDEX CX_Realty ON dbo.Realty (ID);
GO
_

もちろん、これは、メンテナンスウィンドウ中に行う必要があります。そうすれば、ブロッキングが過度に発生することはありません。 Enterprise Editionを使用している場合は、ステートメントにWITH (ONLINE=ON)を追加することで、CREATE INDEX操作をオンラインで実行できます。

3
Max Vernon