SQL Server 2012中引入Sequence
作为一个新的功能,同样在Oracle和Postgres。 当序列优于身份? 为什么我们需要序列?
Answer 1:
我想你会发现你的答案在这里
使用身份属性为列,您可以轻松地生成自动递增的数字(这是经常被用来作为主键)。 随着序列,这将是一个不同的对象,您可以连接到一个表列,同时插入。 不同身份,对于列值的下一个数字会从内存而不是从磁盘获取 - 这使得序列比身份显著快。 我们将在今后的例子看到这一点。
而在这里 :
序列:序列已经被要求在SQL Server社区多年,而且它也包含在这个版本。 序列是一个用户定义的对象,其生成数的序列。 下面是使用序列的例子。
并且这里还有:
一个SQL Server序列对象生成数字序列就像在SQL表标识列。 但序列号的优点是序列号的对象不与单个SQL表的限制。
和MSDN上,您还可以阅读更多关于使用和为什么我们需要它( 这里 ):
一个序列是一个用户定义的模式绑定对象生成根据与该序列的创建规范数字值的序列。 数值的序列中的一个定义的时间间隔的升序或降序顺序生成和可循环(重复)的要求。 序列,与标识列,不与表关联。 应用程序指的是序列对象以接收它的下一个值。 序列和表之间的关系是由应用程序来控制。 用户应用程序可以参考序列对象和协调跨越多个行和表中的值的键。
序列是通过使用CREATE SEQUENCE语句独立于表的创建。 选项使您能够控制增量,最大值和最小值,高起点,自动重启功能,并缓存以提高性能。 有关选项的信息,请参阅CREATE SEQUENCE。
不同于标识列的值,这是当行被插入产生,应用程序可以通过调用FOR功能的下一个值将所述行之前获得下一个序列号。 当NEXT VALUE FOR即使数量从来没有插入到表被称为序列号被分配。 FOR功能的下一个值可以被用作用于在表定义一个列的默认值。 使用sp_sequence_get_range一次拿到范围内的多个序列号。
序列可以被定义为任何整数数据类型。 如果未指定数据类型,序列默认为BIGINT。
Answer 2:
序列和身份都用来生成自动编号,但主要区别是身份是一个表依赖性和序列独立于表。
如果你有,你需要在全球范围内保持一个自动编号(多表)的场景中,也需要重新启动后,特别号码在间隔,你还需要缓存它的性能,而这正是我们需要的序列,而不是地方身份。
下面给出的是定义序列,其实现的现实世界的例子的文章,也序列和身份的区别。
http://raresql.com/2012/04/29/how-sequence-works-in-sql-server-2012/ http://raresql.com/2012/05/01/difference-between-identity-and-序列/
Answer 3:
虽然序列提供更大的灵活性比标识列,我没有发现他们有任何性能优势。
我发现使用性能身份是一贯的3倍比使用序列批量插入更快。
我插入约150万行和性能:
- 14秒身份
- 45秒序列
我插入的行到其经由表默认使用序列对象的表:
NEXT VALUE for <seq> for <col_name>
并且还试图在SELECT语句中指定序列值:
SELECT NEXT VALUE for <seq>, <other columns> from <table>
均高于身份方法较慢相同的因子。 我用的序列默认缓存选项。
在联发的第一个链接引用的文章显示了一行一行地标识和序列之间插入和差异表现为16.6秒,14.3秒10000个插入。
该缓存选项对性能有很大的影响,但身份是更快更高容量(+ 1M行)
看到这个链接为深入分析按utly4life的评论。
Answer 4:
我知道这是有点老了,但想补充的观察,即咬了我。
我从身份切换到序列有我的索引秩序。 我后来发现,序列不具有复制转移。 我开始键冲突,我设置复制后,两个数据库之间因为序列同步没有。 只是要注意你做出决定之前。
Answer 5:
最近被什么位要考虑的身份VS序列。 似乎现在MSFT建议顺序,如果你可能要保持身份无间隙。 我们有那里有在身份的巨大差距的问题,而是在此基础上声明强调将解释我们的问题是SQL缓存的身份,并重新启动后,我们失去了这些数字。
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property?view=sql-server-2017
服务器重新启动或其他故障之后连续值 - SQL Server可能缓存标识值的性能的原因和一些指定的值可以在数据库或服务器故障重启过程中丢失。 这可能会导致在插入时的标识值的差距。 如果差距是不能接受的,那么应用程序应该使用自己的机制来生成键值。 使用序列发生器用NOCACHE选项可以限制国内空白,是永远不会提交的事务。
Answer 6:
我找到序列最好使用不更换标识列,而是创建一个“订单号”字段类型。
换句话说,一个订单号暴露给最终用户,并可能有业务规则与它一起。 你希望它是独一无二的,但只是使用标识列是不是真的正确两种。
例如,不同的订单类型,可能需要不同的顺序,所以你可能有互联网订购的序列,而不是在内部订单。
换句话说,不要以为一个序列简单身份置换的,认为它是在身份不符合业务需求的情况下是有用的。