使用(顺序)GUID是数据库生成ID的唯一可行替代方案吗?

时间:2013-02-06 23:14:31

标签: database entity-framework ef-code-first sql-server-ce identity-column

我们正在使用Entity Framework 5 Code First方法将MS-Access数据库迁移到SQL Server Compact 4.0。我们发现使用数据库生成的整数ID非常慢并且使其变得更糟,延迟随着数据库的大小呈指数增长。这使得使用Identity列不可能,并且似乎在与实体框架配对的SQL Server Compact 4.0中实现了此功能。

因此,我们进行了一些测试,发现使用客户端生成的密钥将插入速度提高了至少20倍,插入的指数增长消失了。

现在我们正在研究生成客户端ID的最佳方法。使用GUID似乎是最安全的选项,但我读到这会对读取操作产生负面影响。是否存在使用客户端生成的自动递增整数的策略?

编辑: 我将研究导致这个问题的潜在问题。同时,我的真实问题可以回答吗? : - )

EDIT2: 令人恼火的是,似乎没有人相信使用自动id与EF和SQL Server compact 4.0的说法是如此之慢。我发布了a separate question关于这一点的概念证明,应该很容易重现。

3 个答案:

答案 0 :(得分:1)

如果您使用EF移动大量数据,那么您做错了。使用ADO.NET,例如使用BULK COPY方法(使用SQL CE使用SqlCeUpdateableRecord)。您可以使用我的SqlCeBulkCopy库来节省一些编码工作。

答案 1 :(得分:1)

我不认为身份生成的方式是性能问题的根源 我想如果你想在迁移过程中获得更好的性能, 在转换过程之前,您可以禁用主键和外键等约束 在你的主桌上。 (这可以通过编写脚本或手工制作) 但是,数据完整性将是您的新问题,转换代码必须很强,因此在转换过程之后,可以启用约束。
希望这会有所帮助。

答案 2 :(得分:0)

我看到的解决方案。

a)尝试修复性能问题。我的建议(不要在上下文中使用大量实体。)尝试尽可能少的业务问题。不要使用合并跟踪等...请参阅EF性能提示。 http://blogs.msdn.com/b/wriju/archive/2011/03/15/ado-net-entity-framework-performance-tips.aspxhttp://msdn.microsoft.com/en-au/library/cc853327.aspx

b)使用Guid。外部分配(不是顺序但快速)​​

c)使用在内存中运行的客户Integer生成器,可以一次分配多个密钥,并且可以保持当前状态。 SAP使用此技术。他们称之为“数字范围”。 可以非常快,但不如b)快。

btw我使用GUID而不是数据库生成的ID来进行部分数据库复制和迁移轻松/简单。 : - )