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的值加大。
如果序列內的值要很長時間才能使用完,可以考慮使用可以循環的序列。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM