我们有一张约有100,000条记录的表,这个记录在我们的应用程序中经常使用。我们有一个身份(ID)列,并有一个聚集索引,并且一切运作良好。但由于某些原因,我们不得不使用Uniqueidentifier列作为主键。因此,我们在其上添加一个非聚集索引并删除ID列上的聚集索引。但是现在,我们在高峰时期有很多客户的性能下降问题。是否因为表格现在没有聚集索引?非集群索引表上的性能问题
回答
您添加主键的事实决不意味着您必须删除聚集索引。这两个概念是不同的。您可以使用由非聚集索引和单独的聚集索引(例如旧的ID
列)实现的uniqueidentifier PK。
但真正的问题是当您添加唯一标识符PK时,您是如何更改应用程序的?您是否还修改了应用程序代码以通过此新PK(通过uniqueidentifier)检索记录?你是否更新所有连接来引用新的PK?您是否修改了引用旧ID
列的所有外键约束条件?或者应用程序是否继续使用旧标识ID
列检索数据?我的期望是,您更改了这两个应用程序和表,并且访问现在流行的形式为SELECT ... FROM table WHERE [email protected]
。如果只有发生此类访问,那么即使使用非群集uniqueidentifier主键并且没有聚簇索引,该表也应该执行OK。所以必须有别的东西在起作用:
- 您的应用程序将继续按照旧标识
ID
列 - 有你的查询连接基于旧的身份
ID
列 - 有访问表引用旧的
ID
列上的表的外键约束
最终,您将遇到性能问题疑难解答问题,并将其视为性能问题排查问题。我有两个很好的资源给你: Waits and Queue methodology和Performance Troubleshooting Flowchart
是的,我们修改了我们的应用程序并写了千行的脚本(!)来更新所有其他表和关系,我们没有放弃ID列,但放弃了聚集索引,它在系统正常情况下正常工作,但在高峰时间,它是真正的很慢。非常感谢你提供有用的链接。我将阅读它们,并再次询问问题是否会延长:) – user1023137 2012-07-12 08:40:14
嗨我认为你可以使用NEWSEQUENTIALID()而不是NEWID()将uniqueidentifier列作为聚簇索引。随着newsequentialid生成序列ID和聚簇索引,它是最好的。
- 1. 集群索引列上的非集群索引可提高性能?
- 2. 通过群集或非聚集索引
- 3. 查询性能悖论:独特的群集与非唯一的非群集索引
- 4. SQL索引问题:为什么SQL Server更喜欢这个非集群索引到一个集群?
- 5. 是Oracle中的索引集群还是非集群?
- 6. 集群索引
- 7. 弹性搜索 - 从集群导出索引到不同集群
- 8. SQL Server非集群索引 - 包含值
- 9. 使用群集与非群集索引上的大数据在SQL
- 10. 实体框架多对多群集与非群集索引
- 11. SQL Server:将群集主索引更改为非群集
- 12. MongoDB的索引和非索引性能
- 13. 群集性能
- 14. 发票项目表集群索引表
- 15. 我很困惑在我的分区中使用集群和非集群索引
- 16. 优化hadoop集群上的nutch性能
- 17. Ehcache在大集群上的性能
- 18. SQL Server - 分区表与集群索引?
- 19. 有效索引能够在多大程度上克服非常大的表的性能问题?
- 20. MySQL数据库索引性能问题
- 21. sqlite提交性能问题与索引
- 22. MySQL创建索引...性能问题
- 23. 创建索引性能问题
- 24. SQL Server聚集索引 - 索引问题
- 25. 与许多网站的事实表上的群集索引
- 26. 集群索引更新来自游标问题
- 27. 什么是列存储索引以及如何从集群和非集群
- 28. 集群索引SQL Server
- 29. 单个表上的群集,索引和分区
- 30. 有关性能的分布式集群问题
它取决于您用来访问数据的查询。为什么不把UniqueIdentifier作为主键? – PraveenVenu 2012-07-12 06:07:34
Guid列现在是主键,它具有非聚簇索引 – user1023137 2012-07-12 06:11:30
您是否明确地将其设为非聚簇? PK默认为聚簇索引。 – PraveenVenu 2012-07-12 06:15:15