zoukankan      html  css  js  c++  java
  • sql2012增加Sequence对象

    官方给出了一大堆SQL2012相对于SQL2008R2的新特性,但是大多数对于普通开发人员来说都是浮云,根本用不到,下面就说说一些对于开发人员来说比较有用的新特性。

    Sequence对象对于Oracle用户来说是最熟悉不过的数据库对象了,现在在SQL Server中终于也看到了类似的对象,只是在使用的语法上有一点点不一样。创建语法也是CREATE SEQUENCE,使用的时候需要使用NEXT VALUE FOR来取下一个值:

    1.用法

    create sequence sq_1
    as bigint
    start with 1
    increment by 1;

    select next value for sq_1 --as firstuse;

    insert into TestSequence_seq(seq_id,seq_value) values(next value for sq_1 ,'test');
    insert into TestSequence_seq(seq_id,seq_value) values(next value for sq_1 ,'test');
    insert into TestSequence_seq(seq_id,seq_value) values(next value for sq_1 ,'test');
    insert into TestSeq(seq_id,seq_value) values(next value for sq_1 ,'test');
    insert into TestSequence_seq(seq_id,seq_value) values(next value for sq_1 ,'test');

    select * from TestSequence_seq
    select * from TestSeq
    select name,type_Desc,start_value,increment,minimum_value,maximum_value,current_value,is_cached from sys.sequences

    下图可看出SequenceNumber最重要的功能是在多表间共享序列号

    2.通过修改Sequence将其初始值指定为一个特定值,

    alter sequence sq_1 restart with 100
    select next value for sq_1

    3.Sequence一个需要注意的情况是Sequence只负责生成序列号,而不管序列号如何使用,如果事务不成功或回滚,SequenceNumber仍然会继续向后生成序列号, 

    alter sequence sq_1 restart with 200  --重置为200
    begin tran
        insert into TestSeq(seq_id,seq_value) values(next value for sq_1 ,'test');
    rollback --虽然事务回滚,但序号仍然向后加1
    select next value for sq_1

    4.还可以为Sequence指定缓存选项,使得减少IO,比如,我们指定Cache选项为4,则当前的Sequence由1增长过4后,SQL Server会再分配4个空间变为从5到8,当分配到9时,SQL Server继续这以循环,如果不指定Cache值,则值由SQL Server进行分配。

    create sequence sq_1
    as bigint
    start with 1
    increment by 1
    cache 5;

    select name,type_Desc,start_value,increment,minimum_value,maximum_value,current_value,cache_size from sys.sequences

    CACHE  n 一次就放入内存n个值。默认值为20,如果你要连续的使用序列,如定单流水号的产生,请将N设大点。如果你不使用序列,而是自己写代码,请注意你的程序效率和竞争锁死情况的发生。
    停止数据库后,内存中存放的序列值会丢失

    使用序列的原则如下:
    如果你想用做主键,请使用不可循环的序列。
    如果想快速发生序列的值,请将cache的值加大。
    如果序列内的值要很长时间才能使用完,可以考虑使用可以循环的序列。

  • 相关阅读:
    SourceInsight3.5中文乱码问题解决
    执行脚本程序出现gzip:stdin:not in gzip format的解决方法
    libjpeg实现arm板上yuv420p转jpg
    yuv420p转jpg linux(纯C语言实现)
    linux下交叉编译libjpeg库并移植到开发板上
    关于arm板上ifup eth0出现问题的解决方法
    关于windows与ubuntu两台主机传输文件的一个小软件
    数据结构之查找算法篇
    利用paramiko将服务器的文件批量匹配并下载到本地
    最近写了中药系统药理学数据库与分析平台的爬虫,可以交流 https://tcmspw.com/index.php
  • 原文地址:https://www.cnblogs.com/Snowfun/p/5196078.html
Copyright © 2011-2022 走看看