将主键约束从一个索引移动到另一个索引

hma*_*ett 7 sql-server

我有一个 SQL Server 数据库,并且已经运行过sp_blitz它。这表明在中等大小的表上有几个堆(在一个案例中为几十万行)。

大多数这些表都有一个主键(一个没有,但我稍后会处理)。主键本身有一个不寻常的名称 - 即不是默认名称,因为大多数表都有一个默认的主键名称 ( PK_tablename)。

有一个名称与主键匹配的索引,该索引是唯一且非聚集的。

我可以重命名主键,但我认为我应该创建一个聚集索引。如果我这样做,那么我将有重复的索引,因此删除非聚集索引是有意义的。但是,它用于主键。

如果我将主键约束从旧的非聚集索引移动到新的聚集索引:

  1. 这有意义吗?
  2. 有什么我应该注意的事情吗?
  3. 执行此操作的最佳方法是什么?

Pau*_*ite 14

以下脚本说明了将现有非集群主键转换为集群主键并对其重命名的有效方法:

-- How the table looks now
CREATE TABLE dbo.Example
(
    pk integer NOT NULL,
    some_data integer NOT NULL,

    CONSTRAINT PK_UnusualName
        PRIMARY KEY NONCLUSTERED (pk)
);

-- Some data
INSERT dbo.Example (pk, some_data)
VALUES (1, 100), (2, 200), (3, 300);

-- Change the nonclustered PK to clustered
CREATE UNIQUE CLUSTERED INDEX PK_UnusualName
ON dbo.Example (pk)
WITH (DROP_EXISTING = ON);

-- Rename
EXECUTE sys.sp_rename 
    @objname = N'dbo.Example.PK_UnusualName',
    @newname = N'PK__dbo_Example_pk',
    @objtype = 'INDEX';

-- Tidy up
DROP TABLE dbo.Example;
Run Code Online (Sandbox Code Playgroud)