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的行,性能是:
我将行插入到一个表中,该表通过表默认使用了序列对象:
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的评论,请参阅此链接进行深入分析.
小智 6
我知道这有点旧,但想添加一个让我感到厌烦的观察。
我从身份切换到序列,以使我的索引井然有序。后来我发现序列不会随着复制而转移。由于序列不同步,我在两个数据库之间设置复制后开始出现密钥冲突。只是在你做出决定之前需要注意的事情。