非聚集索引表的性能问题

时间:2012-07-12 06:02:56

标签: sql-server performance

我们有一张大约有100,000条记录的表格,在我们的应用程序中经常使用。我们有一个标识(ID)列,并在其上有一个聚集索引,一切都很好。但由于某些原因,我们不得不使用Uniqueidentifier列作为主键。因此,我们在其上添加非聚集索引并删除ID列上的聚簇索引。但现在,我们在高峰时期会从客户那里获得大量性能下降。是因为表现在没有聚集索引吗?

2 个答案:

答案 0 :(得分:2)

您添加主键的事实绝不意味着您必须删除聚簇索引。这两个概念是截然不同的。您可以拥有由非聚集索引和单独的聚簇索引(例如旧ID列)实现的uniqueidentifier PK。

但真正的问题是当你添加uniqueidentifier PK 时,你是如何更改你的应用程序的?您是否还修改了应用程序代码以通过此新PK(由uniqueidentifier)检索记录?您是否更新了所有联接以引用新PK?您是否修改了引用旧ID列的所有外键cosntraints?或者应用程序是否继续使用旧标识ID列检索数据?我的期望是你改变了两个应用程序和表格,现在访问权限在SELECT ... FROM table WHERE pk=@uniqueidentifier的形式上很普遍。如果发生此类访问,则即使使用非群集uniqueidentifier主键且没有聚簇索引,该表也应执行OK。所以必须有其他的东西在发挥作用:

  • 您的应用程序将继续根据旧标识ID
  • 访问该表
  • 根据旧标识ID
  • ,您的查询中存在联接
  • 引用旧ID
  • 上的表的外键约束

最终,您手头有性能故障排除问题,并将其视为性能故障排除问题。我有两个很棒的资源: Waits and Queue methodologyPerformance Troubleshooting Flowchart

答案 1 :(得分:1)

您好我认为您可以使用NEWSEQUENTIALID()而不是NEWID()将uniqueidentifier列设置为聚簇索引。由于newsequentialid生成顺序ID,因此聚簇索引最好。