0

我们有一个包含大约 100,000 条记录的表,在我们的应用程序中经常使用。我们有一个标识 (ID) 列,并且上面有一个聚集索引,一切都运行良好。但由于某些原因,我们不得不使用 Uniqueidentifier 列作为主键。因此,我们在其上添加了一个非聚集索引,并在 ID 列上删除了聚集索引。但是现在,我们在高峰期遇到了很多来自客户的性能下降问题。是因为表现在没有聚集索引吗?

4

2 回答 2

2

您添加主键这一事实绝不意味着您必须删除聚集索引。这两个概念是不同的。ID您可以通过非聚集索引和选择的单独聚集索引(例如旧列)实现唯一标识符 PK 。

但真正的问题是,当您添加 uniqueidentifier PK 时,您是如何更改您的应用程序的?您是否还修改了应用程序代码以通过这个新的 PK(通过唯一标识符)检索记录?您是否更新了所有连接以引用新的 PK?您是否修改了所有引用旧ID列的外键约束?或者应用程序是否继续使用旧的标识ID列检索数据?我的期望是您更改应用程序和表,并且访问现在以SELECT ... FROM table WHERE pk=@uniqueidentifier. 如果发生这种访问,那么即使使用非聚集唯一标识符主键且没有聚集索引,该表也应该可以正常运行。所以肯定有别的东西在起作用:

  • 您的应用程序继续访问基于旧标识ID列的表
  • 您的查询中有基于旧标识ID列的连接
  • 有外键约束引用旧ID列上的表

最终,您手头有一个性能故障排除问题,并将其作为性能故障排除问题来处理。我有两个很好的资源给你:等待和队列方法性能故障排除流程图

于 2012-07-12T06:37:55.487 回答
1

嗨,我认为您可以使用 NEWSEQUENTIALID() 而不是 NEWID() 将 uniqueidentifier 列作为聚集索引。由于 newsequentialid 生成顺序 ID,并且对于聚集索引,它是最好的。

于 2012-07-12T09:06:57.320 回答