实体框架中的序列比身份更快吗?
Posted
技术标签:
【中文标题】实体框架中的序列比身份更快吗?【英文标题】:Is Sequence faster than Identity in Entity Framework? 【发布时间】:2016-05-17 07:08:16 【问题描述】:听说在 Sql Server 中 Sequence 比 Identity 快。但是,我认为在实体框架中使用它不是一个好主意。因为,要在实体框架中使用序列,您应该进行额外的调用以获取下一个序列。
int sequence = context.Database.SqlQuery<int>("SELECT NEXT VALUE FOR MySequenceName").FirstOrDefault();
因此,我认为在 Entity Framework 中使用 Sequence 会比较慢。我对吗?有人知道吗?
【问题讨论】:
SEQUENCE
本身并不比IDENTITY
快。您可以控制缓存大小,这在某些情况下可能会带来一点好处,但对于大型多行插入序列实际上更慢dba.stackexchange.com/a/31095/3690
一般来说,您不应该对您的代码进行任何更改,“因为您听说 X 比 Y 快”。您需要断言的上下文(很少有 X 总是优于 Y 并且是 Y 的 1-1 替代品的情况 - 特别是因为如果它是真的,他们只会用 X 替换 Y 的实现)。您还需要考虑您是否真的有性能问题开始,以及它是否真的由Y
引起。
感谢大家的宝贵cmets
【参考方案1】:
是的,序列比身份更快,因为您从内存而不是从光盘中获取它。
它们可以在任意多种情况下使用,但我认为它们的真正力量在于:
插入前获取密钥 使用来自同一序列的唯一键 在多个表中如果您不需要这些点,那么我将只使用身份,一次调用 db,一次事务。 在实体框架中使用它,正如你所说,你需要一个额外的调用来获取密钥,这并没有使它真正有用。
【讨论】:
【参考方案2】:不一定(您需要多个 db 调用),您可以将 EF 与 Stored Procs 结合使用,并将从序列中检索 ID 的逻辑和 insert(s) 放在 Stored Proc 中。这可以简化和抽象 Id 的检索和分配,因此您不必将其编写为 c# 代码的一部分。
如果您想保持简单,请仅在您认为速度至关重要且不使用 Sequence 会影响 Sql 语句的性能的情况下使用 Sequence。例如,在您希望执行大量批量插入或希望预先确定 id 以使插入多个表的过程更加简化的表上。您可以继续使用 Identity 的所有其他表。
另请参阅之前的SO answer,其中介绍了如何在 EF 代码中使用 Sequence,它几乎与您在问题中已有的内容一样,但包含了其余的 c# 代码。
【讨论】:
【参考方案3】:听说Sequence比Sql Server中的Identity快。
我上次检查时正好相反:Sequence and Identity Performance。当然,这种情况在下一个 SQL Server 版本中可能(并且可能会)改变,但现在 - 你听错了。
关于“额外调用” - 你不认为scope_identity()
的结果是通过纯魔法出现在你的应用程序中的,不是吗?
【讨论】:
以上是关于实体框架中的序列比身份更快吗?的主要内容,如果未能解决你的问题,请参考以下文章