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

时间:2016-05-17 07:08:17

标签: c# sql-server entity-framework sequence

我听说在Sql Server中Sequence比Identity更快。但是,我不认为在Entity Framework中使用它是个好主意。因为要在实体框架中使用序列,你应该进行额外的调用以获得下一个序列。

int sequence = context.Database.SqlQuery<int>("SELECT NEXT VALUE FOR MySequenceName").FirstOrDefault();

因此,我认为在实体框架中使用序列会比较慢。我对吗?有没有人有任何想法?

3 个答案:

答案 0 :(得分:3)

是的,序列比身份更快,因为你从内存而不是从光盘中获取它。

它们可以在任意多种情况下使用,但我认为它们的真正力量是:

  • 在插入
  • 之前获取密钥
  • 使用同一序列中的唯一键 在多个表中

如果你不需要这些点,那么我只会使用身份,一次调用db,一次交易。 在实体框架中使用它,正如你所说,你需要一个额外的调用来获取密钥,这不会使它真正有用。

答案 1 :(得分:2)

不一定(您需要多次数据库调用),您可以将EF与存储过程结合使用,并将序列和插入中的ID检索逻辑放入存储过程中。这可以简化和抽象ID的检索和分配,因此您不必将其作为c#代码的一部分进行编写。

如果您想保持简单,只使用您认为速度至关重要的序列,并且不使用序列会影响Sql语句的性能。例如,在您希望执行大量批量插入的表上,或者想要预先确定id以使多个表中的插入更加简化。您可以继续使用Identity的所有其他表。

另请参阅前面的SO answer,其中介绍了如何在EF代码中使用Sequence,它几乎就是您在问题中已有的内容,但包含了其余的c#代码。

答案 2 :(得分:1)

  

我听说在Sql Server中,Sequence比Identity更快。

上次检查时,情况正好相反:Sequence and Identity Performance。当然,这种情况可能(并且可能会)在下一个SQL Server版本中发生变化,但是现在 - 你听错了。

关于“额外通话” - 你不认为纯粹的魔法师会在你的申请中出现scope_identity()的结果,不是吗?