实体框架中的序列比身份更快吗?

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() 的结果是通过纯魔法出现在你的应用程序中的,不是吗?

【讨论】:

以上是关于实体框架中的序列比身份更快吗?的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb聚合框架比map/reduce更快吗?

为啥实体框架在直接选择语句中的执行速度比 Dapper 快 [关闭]

python 中的成员资格测试比 set() 更快

火花检查点比缓存更快吗?

如何删除实体框架中的循环引用?

无法在 .NET 中的实体框架代码优先方法中迁移 AspNetUser 实体