上下文
我们开始开发一个使用GUID作为PK的系统,默认情况下使用Entity Framework标记为群集(我知道......)。我现在意识到在插入数据库时这可能会影响性能,特别是因为GUID用作聚簇索引。
我做了一些研究,发现了很多有用的信息,但我仍然对如何解决这个问题感到困惑。此外,如果我们决定从GUID PK转到INT,我们有一个包含近百万行的生产数据库。
问题(S):
另一种解决方案是将聚集索引更改为另一列(即:DateTime),但如果我们的联接主要使用PK,那么这会给我们带来多大的性能差异?
开始使用顺序guids(NHibernate Comb),但如果我们现有的Guids不是顺序的,那么如果我们刚开始对新行使用顺序guid会对它产生影响吗?
如果最佳解决方案是从GUID迁移到INT,那么是否可以使用实体代码优先迁移(如果可能的话)?
此时我是否应该担心这个问题?也许它是预先优化的,但数据库正在快速增长,我不想在2-3百万行之后继续前进,并意识到我们必须尽快修复它。
约束
我感谢任何有助于我做出正确决定的建设性反馈。我不是在寻找一个书面解决方案,但可能只是一些指导我指出正确的道路。
答案 0 :(得分:0)
将GUID作为PK不是问题。但是当您在GUID列上具有CLUSTERED索引时,它可能会导致性能问题。因此,您可以保留所有PK,同时将CLUSTERED索引迁移到您想要的任何内容。
每个PK列(guid)上仍然存在索引,因此在唯一值上加入性能会是一样的。更改将仅影响写入和可能的读取性能。写入时页面拆分的次数会减少,因为行将按顺序附加到索引的末尾,而不是插入到聚簇索引的中间和开头的随机页面中。
你可以改变你的PK选项NONCLUSTERED并创建另一个聚簇索引(不必是PK或甚至是唯一的)。