用INT IDENTITY PK替换GUID PK

时间:2013-06-19 18:05:57

标签: sql sql-server indexing guid

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

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

我已经在这些方面阅读了一些内容(即Clustered and nonclustered indexes 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和1列6都是PK的一部分。

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

谢谢, 凯文

1 个答案:

答案 0 :(得分:4)

实际上,当你按照这些步骤(我假设T-SQL语法不是你的麻烦)时,这很简单:

  1. 删除PK(从而删除聚集索引)
  2. 使用4列
  3. 添加非聚集的UNIQUE索引
  4. 添加IDENTITY列
  5. 为PK
  6. 添加群集PK约束