2

我有一个旧版应用程序,无论出于何种原因,它始终具有 GUID PK。不幸的是,其中一张表有 3.5+ 百万行,性能开始受到影响。我很确定这是因为 GUID 是 PK 并且是聚集索引的一部分。

我想将该表更改为具有聚集部分的 INT IDENTITY PK,并将当前聚集索引保留为非聚集索引。

我已经按照这些思路在这里阅读了一些内容(即 Clustered and nonclustered index performance),但我所阅读的所有内容都假设涉及单列。

这是我的情况变得令人困惑的地方(至少对我来说):

该表有一个基于 4 列的 PK/聚集索引!

我尝试创建一个具有相同架构的新表以及新的 int 标识列,但我无法将 PK 与聚集索引完全分开(如上面文章中所建议的那样)。

表架构:

ProjectItemID  (PK, FK, uniqueidentifier, not null)   <--- GUID
PermissionSourceType  (PK, int, not null)
GranteeID  (PK, uniqueidentifier, not null)           <--- GUID
GranteeType  (int, not null)
Access  (int, not null)
PermissionType  (PK, int, not null)
ExpirationDate  (datetime, null)

如您所见,第 1、2、3 和 6 列都是 PK 的一部分。

如何编写新表的脚本(添加了 int 标识 PK),以便单列 PK 是聚集索引,但 OLD PK 字段位于非聚集索引中?

谢谢,凯文

4

1 回答 1

4

实际上,当您按照以下步骤操作时,它非常简单(我假设 T-SQL 语法对您来说不是问题):

  1. 删除 PK(从而删除聚集索引)
  2. 添加具有 4 列的非聚集 UNIQUE 索引
  3. 添加 IDENTITY 列
  4. 为 PK 添加集群 PK 约束
于 2013-06-19T18:49:04.843 回答