序列与身份

Sle*_*idi 78 sql t-sql sql-server sql-server-2012

SQL Server 2012 Sequence作为新功能引入,与Oracle和Postgres相同.哪个序列优于身份?为什么我们需要序列?

Ari*_*ion 73

我想你会在这里找到答案

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

在这里:

序列:SQL Server社区多年来一直在请求序列,并且它包含在此版本中.Sequence是用户定义的对象,它生成一个数字序列.这是使用Sequence的示例.

并且这里还有:

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

在msdn上你还可以阅读更多关于用法和我们需要的原因(这里):

序列是用户定义的模式绑定对象,它根据创建序列的规范生成一系列数值.数值序列以定义的间隔以升序或降序生成,并且可以根据请求循环(重复).与标识列不同,序列与表无关.应用程序引用序列对象来接收其下一个值.序列和表之间的关系由应用程序控制.用户应用程序可以引用序列对象并跨多个行和表协调值键.

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

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

序列可以定义为任何整数数据类型.如果未指定数据类型,则序列默认为bigint.


小智 19

序列和标识都用于生成自动编号但主要区别是标识是表依赖的,而序列独立于表.

如果您有一个需要全局维护自动编号的场景(在多个表中),您还需要在特定编号后重新启动间隔,并且还需要将其缓存以提高性能,这里是我们需要序列的地方而不是身份.

下面给出了定义序列的真实世界示例,其实现以及序列和身份之间差异的文章.

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


Sta*_*agg 13

尽管序列比标识列提供了更多的灵活性,但我没有发现它们具有任何性能优势.

我发现使用标识的性能始终比使用批处理插入序列快3倍.

我插入了大约1.5M的行,性能是:

  • 14秒的身份
  • 顺序为45秒

我将行插入到一个表中,该表通过表默认使用了序列对象:

NEXT VALUE for <seq> for <col_name>

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

SELECT NEXT VALUE for <seq>, <other columns> from <table>
Run Code Online (Sandbox Code Playgroud)

两者都是比身份方法慢的相同因素.我使用序列的默认缓存选项.

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

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

根据utly4life的评论,请参阅此链接进行深入分析.

  • http://byobi.com/blog/2012/09/sequence-vs-identity-performance-comparison/提供各种配置的详细比较.显示高速缓存大小从50增加到500,产生大约2倍的速度差异. (2认同)

小智 6

我知道这有点旧,但想添加一个让我感到厌烦的观察。

我从身份切换到序列,以使我的索引井然有序。后来我发现序列不会随着复制而转移。由于序列不同步,我在两个数据库之间设置复制后开始出现密钥冲突。只是在你做出决定之前需要注意的事情。