序列与身份

SQL Server 2012引入了Sequence作为新function,与Oracle和Postgres相同。 序列优先于身份? 为什么我们需要序列?

我想你会在这里find你的答案

使用列的标识属性,您可以轻松地生成自动递增数字(通常用作主键)。 使用序列,它将是一个不同的对象,您可以在插入时附加到表列。 与身份不同,列值的下一个数字将从内存中而不是从磁盘中检索 – 这使得Sequence比Identity更快。 我们将在未来的例子中看到这一点。

在这里 :

序列:SQL Server社区已经请求了多个序列,并且包含在此版本中。 序列是一个用户定义的对象,用于生成一个数字序列。 这里是一个使用序列的例子。

这里也是:

一个SQL Server序列对象就像sql表中的一个标识列一样产生数字序列。 但序号的优点是序号对象不受单个sql表的限制。

并在msdn上,您还可以阅读更多关于使用情况和为什么我们需要它( 在这里 ):

序列是用户定义的模式绑定对象,它根据创build序列的规范生成一系列数值。 数值序列以定义的时间间隔以升序或降序生成,并可按要求循环(重复)。 与身份列不同,序列不与表关联。 应用程序引用一个序列对象来接收下一个值。 序列和表之间的关系由应用程序控制。 用户应用程序可以引用一个序列对象,并在多个行和表中协调值键。

使用CREATE SEQUENCE语句独立于表创build序列。 通过选项,可以控制增量,最大值和最小值,起点,自动重新启动function和caching,以提高性能。 有关这些选项的信息,请参阅CREATE SEQUENCE。

与插入行时生成的标识列值不同,应用程序可以在插入行之前通过调用NEXT VALUE FOR函数获取下一个序列号。 当调用NEXT VALUE FOR时,即使数字永远不会插入到表中,也会分配序号。 NEXT VALUE FOR函数可以用作表定义中列的默认值。 使用sp_sequence_get_range一次获取多个序号的范围​​。

一个序列可以被定义为任何整型数据types。 如果未指定数据types,则序列默认为bigint。

序列和身份都用于生成自动编号,但主要区别是身份是一个表依赖和序列是独立于表。

如果你有一个需要全局维护一个自动编号的场景(在多个表中),你也需要在特定的编号之后重新启动一个自动编号,而且你需要为了性能而caching它,这里是我们需要序列的地方而不是身份。

以下给出了定义现实世界范例的序列,实现以及序列和身份之间的区别的文章。

http://raresql.com/2012/04/29/how-sequence-works-in-sql-server-2012/ http://raresql.com/2012/05/01/difference-between-identity-and-序列/

虽然序列比标识列提供更多的灵活性,我没有发现他们有任何性能优势。

我发现使用身份的性能比使用批量插入序列快3倍。

我插入了约150万行,performance是:

  • 14秒为身份
  • 45秒序列

我将这些行插入到一个使用序列对象的表中:

NEXT VALUE for <seq> for <col_name>

并且还尝试在select语句中指定序列值:

 SELECT NEXT VALUE for <seq>, <other columns> from <table> 

这两个因素都比同一个方法慢。 我使用序列的默认caching选项。

在Arion的第一个链接中引用的文章显示了逐行插入的性能,并且对于10,000个插入,身份和序列之间的差异为16.6秒到14.3秒。

caching选项对性能有很大影响,但对于更高的卷(+ 1M行),身份更快

根据utly4life的评论,查看此链接进行深入分析。