SQL Server2012中的SequenceNumber

簡介

    SequenceNumber是SQL Server2012推出的一個新特性。這個特性允許數據庫級別的序列號在多表或多列之間共享。對於某些場景會非常有用,比如,你需要在多個表之間公用一個流水號。以往的做法是額外建立一個表,然後存儲流水號。而新插入的流水號需要兩個步驟:

    1.查詢表中流水號的最大值

    2.插入新值(最大值+1)

    現在,利用SQL Server2012中的Sequence.這類操作將會變得非常容易。

 

SequenceNumber的基本概念

    SequenceNumber的概念並不是一個新概念,Oracle早就已經實現了(http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_6015.htm)。與以往的Identity列不同的是。SequenceNumber是一個與構架綁定的數據庫級別的對象,而不是與具體的表的具體列所綁定。這意味着SequenceNumber帶來多表之間共享序列號的遍歷之外,還會帶來如下不利影響:

  •     與Identity列不同的是,Sequence插入表中的序列號可以被Update,除非通過觸發器來進行保護
  •     與Identity列不同,Sequence有可能插入重複值(對於循環SequenceNumber來說)
  •      Sequence僅僅負責產生序列號,並不負責控制如何使用序列號,因此當生成一個序列號被Rollback之後,Sequence會繼續生成下一個號,從而在序列號之間產生間隙。

 

SequenceNumber的用法

    SequenceNumber在MSDN中定義的原型如代碼1所示。

CREATE SEQUENCE [schema_name . ] sequence_name
    [ AS [ built_in_integer_type | user-defined_integer_type ] ]
    [ START WITH <constant> ]
    [ INCREMENT BY <constant> ]
    [ { MINVALUE [ <constant> ] } | { NO MINVALUE } ]
    [ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ]
    [ CYCLE | { NO CYCLE } ]
    [ { CACHE [ <constant> ] } | { NO CACHE } ]
    [ ; ]

    代碼1.Sequence的創建原型

 

    由代碼1看以看到,參數相對比較簡單。從指定數據類型(INT兼容)到開始計數點,步長,最大值和最小值,是否循環和是否緩存幾個參數來設置Sequence。

    下面圖1創建了一個簡單的Sequence。

    1

    圖1.創建一個簡單的Sequence並進行使用

 

    此時,我們可以通過SQL Server 2012新增的視圖sys.sequences來看到剛纔創建成功的Sequence,如圖2所示.

    2

    圖2.sys.sequences視圖

 

    當然我們可以這個序列按照順序插入表,如圖3所示。

    3

    圖3.在單表中插入序列

 

    而SequenceNumber最重要的功能是在多表間共享序列號,如圖4所示。

    4

     圖4.多表之間利用Sequence共享序列號

 

    前面圖2可以看到,如果我們不指定Sequence的上限和下限,則默認使用所指定數據類型的最大值和最小值作爲上限和下限(如圖2INT類型的的上下限).當達到上線後,可以指定循環來讓Sequence達到上限後從指定的開始值重新開始循環。如圖5所示。

    5

    圖5.Sequence設置上限下限和循環

 

    還可以通過修改Sequence將其初始值指定爲一個特定值,如圖6所示。

    6

    圖6.重置Sequence的值

 

    Sequence一個需要注意的情況是Sequence只負責生成序列號,而不管序列號如何使用,如果事務不成功或回滾,SequenceNumber仍然會繼續向後生成序列號,如圖7所示。

    7

    圖7.Sequence僅僅負責生成序列號

 

    我們還可以爲Sequence指定緩存選項,使得減少IO,比如,我們指定Cache選項爲4,則當前的Sequence由1增長過4後,SQL Server會再分配4個空間變爲從5到8,當分配到9時,SQL Server繼續這以循環,如果不指定Cache值,則值由SQL Server進行分配。一個簡單的例子如圖8所示。

    8

    圖8.爲Sequence設置Cache選項

 

 

總結

    本文講述了SequenceNumber的簡單用法。Sequence是一個比較方便的功能,如果使用妥當,將會大大減少開發工作和提升性能。

 

參考資料:Sequence Numbers

                CREATE SEQUENCE (Transact-SQL)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章