在不删除主键的情况下更改聚集索引

Tom*_*bes 6 foreign-key sql-server primary-key clustered-index full-text-search

过去,我选择创建datetime列作为表中不合适的聚集索引。

现在我得出结论(基于执行计划)选择 ID身份主键作为聚集键会更好,因为它经常被作为外键引用。

我想删除当前的聚集键并创建一个新的,但我不能删除主键,因为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
Run Code Online (Sandbox Code Playgroud)

Han*_*non 4

只需删除现有的聚集索引,然后在该ID列上创建一个新的索引即可。

DROP INDEX [Created] ON dbo.Realty;
GO

CREATE UNIQUE CLUSTERED INDEX CX_Realty ON dbo.Realty (ID);
GO
Run Code Online (Sandbox Code Playgroud)

当然,您需要在维护时段执行此操作,这样就不会造成太多阻塞。WITH (ONLINE=ON)如果您有企业版,您可以通过添加到语句来在线执行 CREATE INDEX 操作。

  • 这里的一个缺点是表现在将在 (ID) 上留下一个聚集索引,在 (ID) 上留下另一个非聚集索引(主键)。虽然在某些情况下,这个(较窄的)重复索引是一个好主意,但我不觉得这是O​​P在这种情况下真正想要的。 (2认同)