将Guid主键和聚簇索引迁移到INT(Azure SQL)

时间:2016-02-11 21:36:19

标签: sql-server entity-framework azure primary-key clustered-index

上下文

我们开始开发一个使用GUID作为PK的系统,默认情况下使用Entity Framework标记为群集(我知道......)。我现在意识到在插入数据库时​​这可能会影响性能,特别是因为GUID用作聚簇索引。

我做了一些研究,发现了很多有用的信息,但我仍然对如何解决这个问题感到困惑。此外,如果我们决定从GUID PK转到INT,我们有一个包含近百万行的生产数据库。

问题(S):

  1. 另一种解决方案是将聚集索引更改为另一列(即:DateTime),但如果我们的联接主要使用PK,那么这会给我们带来多大的性能差异?

  2. 开始使用顺序guids(NHibernate Comb),但如果我们现有的Guids不是顺序的,那么如果我们刚开始对新行使用顺序guid会对它产生影响吗?

  3. 如果最佳解决方案是从GUID迁移到INT,那么是否可以使用实体代码优先迁移(如果可能的话)?

  4. 此时我是否应该担心这个问题?也许它是预先优化的,但数据库正在快速增长,我不想在2-3百万行之后继续前进,并意识到我们必须尽快修复它。

  5. 约束

    • MSSQL(托管在Azure SQL上)
    • 实体框架代码优先迁移(最好)
    • 需要迁移的现有数据库

    我感谢任何有助于我做出正确决定的建设性反馈。我不是在寻找一个书面解决方案,但可能只是一些指导我指出正确的道路。

1 个答案:

答案 0 :(得分:0)

将GUID作为PK不是问题。但是当您在GUID列上具有CLUSTERED索引时,它可能会导致性能问题。因此,您可以保留所有PK,同时将CLUSTERED索引迁移到您想要的任何内容。

每个PK列(guid)上仍然存在索引,因此在唯一值上加入性能会是一样的。更改将仅影响写入和可能的读取性能。写入时页面拆分的次数会减少,因为行将按顺序附加到索引的末尾,而不是插入到聚簇索引的中间和开头的随机页面中。

你可以改变你的PK选项NONCLUSTERED并创建另一个聚簇索引(不必是PK或甚至是唯一的)。