如何在线有效地创建新的 PRIMARY KEY CLUSTERED 定义

Jos*_*gle 5 schema sql-server primary-key clustered-index

给定一个表具有主键定义(作为聚集索引),我想有效地更改定义(或者至少,刚刚聚集索引)的PRIMARY KEY的网络

我想简单地执行以下操作:

CREATE UNIQUE CLUSTERED INDEX PK_MyTable ON dbo.MyTable
(
    [Col2] ASC
) WITH (DROP_EXISTING = ON, ONLINE = ON);
Run Code Online (Sandbox Code Playgroud)

但是,这会导致错误:Cannot recreate index 'PK_MyTable'. The new index definition does not match the constraint being enforced by the existing index.. 我明白为什么。

有没有另一种方法来实现这一点?

对于背景:我们有一个只能通过非聚集索引查询的表。该索引的特性非常适合作为表的聚集索引(即唯一且不变的窄键,插入主要在“末尾”)。当前的 PRIMARY KEY(聚集索引)只是一个代理键。该表不是任何 FK 关系的目标,并且从不通过当前 PRIMARY KEY 查询行。我们想在线有效地更改聚集索引。我们正在运行企业版。

如果条款“在线”操作;至少我们希望继续插入新行,但我们可以暂时挂起查询,直到操作完成。

如果无法在线使用现有表执行此操作,是否有一种方法(可能涉及新表并复制数据)可以在尽可能少的中断情况下工作?

Jon*_*des 3

如果您运行的是企业版,则可以使用ONLINE.

由于您现有的 PK 未被使用,您可以先删除它。然后创建新的聚集索引,最后删除现已过时的旧非聚集索引。

 ALTER TABLE MyTable DROP CONSTRAINT PK_MyTbl_SrgKey WITH (ONLINE=ON)
 ALTER TABLE MyTable ADD CONSTRAINT PK_MyTbl_BizKey PRIMARY KEY (X) WITH (ONLINE=ON)
 DROP INDEX IX_MyTbl_BizKey ON MyTable WITH (ONLINE=ON)
Run Code Online (Sandbox Code Playgroud)

biz 关键字段在任何时候都不会被取消索引,并且应该有最小的阻塞。

我猜您已经熟悉这种语法,并且您希望有更简单或更原子的东西。希望有人可以提供这个!