首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何有效地在线创建新的主键群集定义

如何有效地在线创建新的主键群集定义
EN

Database Administration用户
提问于 2015-02-18 16:41:33
回答 1查看 3.9K关注 0票数 5

给定一个具有主键定义(作为聚集索引)的表,我希望在线有效地更改主键的定义(或者至少更改聚集索引)。

我想简单地做以下几点:

代码语言:javascript
复制
CREATE UNIQUE CLUSTERED INDEX PK_MyTable ON dbo.MyTable
(
    [Col2] ASC
) WITH (DROP_EXISTING = ON, ONLINE = ON);

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

还有别的方法可以做到这一点吗?

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

如果“联机”操作的术语;至少我们希望继续插入新的行,但我们可以暂时挂起查询,直到操作完成。

如果不可能在现有的联机表中做到这一点,那么是否有一种方法(可能涉及一个新表并复制数据)可以在尽可能少的中断情况下工作呢?

EN

回答 1

Database Administration用户

发布于 2015-02-18 17:57:01

如果正在运行Enterprise,则可以使用ONLINE添加和删除索引,包括聚集索引。

因为您现有的PK没有被使用,所以您可以从放弃它开始。然后创建新的聚集索引,最后删除已经过时的旧非聚集索引。

代码语言:javascript
复制
 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)

在任何一点上,biz键字段都不会被索引,并且应该有最小的阻塞。

我猜您已经熟悉这个语法了,您希望得到一些更简单或更原子的语法。希望有人能提供这个!

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/93235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档