Oracle的sequence

概述

Oracle的sequence,就是序列號,它提供一系列的按照事先指定的方式進行增長的數字。oracle sequence的最大值是38個整數。【 Sequences are database objects from which multiple users can generate unique integers.】。一般來說,sequence常用於生成數據庫的主鍵。

Oracle將sequence的定義存儲在數據字典之中,因此,所有的sequence都在數據庫的SYSTEM表空間裡面。

引用sequence的當前值使用CURRVAL,而生成sequence的下一個值使用NEXTVAL來實現。初始化一個剛剛新建的sequence使用NEXTVAL,它會返回新sequence的第一值。另外還要注意,在一個全新的會話中,使用CURRVAL之前必須至少使用一次NEXTVAL。

sequence是獨立於表的,也就是說一個sequence可以同時被多個表使用來生成主鍵。

sequence是獨立於事務的,就是說序列的增加不需要等待事務的完成,也就是說序列是異步於事務而增長的。這種現象就說明,如果你根本訪問不了別的用戶用sequence產生的值,也就是說你只能訪問到你當前產生的值,即使其他用戶已經增加了sequence的值;還說明如果你事務回滾,sequence不會回滾,它所發生的改變是一維的。請看一個例子:

-- session 1

SQL> select distinct sid from v$mystat;

SID

----------

147

SQL> create sequence seqtest;

Sequence created.

SQL> select seqtest.nextval from dual; -- 第一次初始化sequence

NEXTVAL

----------

1

SQL> select seqtest.nextval from dual;

NEXTVAL

----------

2

-- session 2

SQL> select distinct sid from v$mystat;

SID

----------

143

SQL> select seqtest.currval from dual; -- 在一個新會話中,第一次使用currval之前必須先使用nextval

select seqtest.currval from dual

*

ERROR at line 1:

ORA-08002: sequence SEQTEST.CURRVAL is not yet defined in this session

SQL> select seqtest.nextval from dual; -- 是sequence值增加1

NEXTVAL

----------

3

-- session 1,雖然這個時候session已經增加了sequence的值,但是session 1只能看到自己增加的sequence的部分。

SQL> select seqtest.currval from dual;

CURRVAL

----------

2

如果在一個語句中,有多個部分使用了NEXTVAL,那麼只有第一個NEXTVAL會使sequence改變一次,其他的不會是sequence發生變化。請看:

SQL> select seqtest.nextval,seqtest.nextval,seqtest.nextval from dual;

NEXTVAL NEXTVAL NEXTVAL

---------- ---------- ----------

5 5 5

sequence可以在下列場合中使用:

1. VALUES clause of INSERT statements

2. The SELECT list of a SELECT statement

3. The SET clause of an UPDATE statement

而不能在下列場合使用:

■ A subquery

■ A view query or materialized view query

■ A SELECT statement with the DISTINCT operator

■ A SELECT statement with a GROUP BY or ORDER BY clause

■ A SELECT statement that is combined with another SELECT statement with the UNION, INTERSECT, or MINUS set operator

■ The WHERE clause of a SELECT statement

■ DEFAULT value of a column in a CREATE TABLE or ALTER TABLE statement

■ The condition of a CHECK constraint

在平時中,更應該注意的是這些不能使用的情況。

創建

要想創建自己的序列,你必須擁有CREATE SEQUENCE 權限;如果是創建其他用戶的序列,你則必須要擁有CREATE ANY SEQUENCE權限。下面,我們來看一下創建語法:

Oracle的sequence

INCREMENT BY:用於指定sequence的一次變化量,它可以是正整數(此時表示序列變化是增加)和任何負整數(此時表示序列變化是減小),但是不能為零。這個數字的個數必須是小於或者等於28個數字,且這個值的絕對值必須介於MAXVALUE和MINVALUE之間。如果你沒有指定這個值,那麼就是1。

START WITH :指定sequence的第一個值,同樣這個數字的個數也必須是小於或者等於28個。如果沒有指定這個值,對於升序序列,它就是MINVALUE;而對於降序序列,它就是MAXVALUE。

MAXVALUE:指定sequence的最大值,它的個數必須是小於或者等於28個數字,它必須大於或者等於START WITH指定的值,且必須大於MINVALUE。

NOMAXVALUE:表示最大值是“無限”,對於升序序列是1027,而對於降序序列是-1。

MINVALUE:指定sequence的最小值,它的個數必須是小於或者等於28個數字,它必須小於或者等於START WITH指定的值,且必須小於MAXVALUE。

NOMINVALUE:表示最小值是“無限”,對於升序序列是1,而對於降序序列是-1026。

CYCLE/NOCYCLE:指定當序列達到最大(升序序列)和最小(降序序列)值的時候,序列是否要循環使用。

ORDER/NOORDER:默認情況下是NOORDER,這兩個參數控制著序列是否按照順序生成。只有在RAC環境中,這兩個參數才有相應的實際意義。

CACHE/NOCACHE:

cache指定一次從數據字典中預分配多少個值,然後把這些值放在內存中以提供訪問,這樣就能提高訪問速度。當內存中的值全部被使用完畢以後,再從數據字典中預分配這些值並且cache到內存,如此往復。同樣,cache指定的這個數字的必須是少於28個,且其最小值是2。

兩個重要的概念:

The Number of Entries in the Sequence Cache When an application accesses a sequence in the sequence cache, the sequence numbers are read quickly. However, if an application accesses a sequence that is not in the cache, then the sequence must be read from disk to the cache before the sequence numbers are used.

The Number of Values in Each Sequence Cache Entry When a sequence is read into the sequence cache, sequence values are generated and stored in a cache entry. These values can then be accessed quickly. The number of sequence values stored in the cache is determined by the CACHE parameter in the CREATE SEQUENCE statement. The default value for this parameter is 20.

可見sga中的sequence cache放的是sequence cache entries(就是許多sequece的cache),而一個sequence cache entry中存放了這個sequence的多個values(單個sequence的多個value)。CACHE參數就是控制著單個sequence可以緩存多少value的。默認值是20,即你不指?ACHE,也不指定NOCACHE,那麼就表示CACHE=20。

當使用NOCACHE的時候,這樣這個sequence的就不會緩存到內存,於是對它的每一次訪問都會導致一個物理讀和一個邏輯讀。

使用CACHE參數,是否會帶來相關的隱患呢?答案是肯定有的。當發生實例失敗的時候,在內存中的那些sequence值都會丟失,也就是出現了sequence的“跳躍”。還有當在EXP/IMP的時候,如果在exp執行期間仍然有事務在訪問該sequence,則次sequence也可能會出現“跳躍”。

有關CACHE參數值的設定,還有一個限制:

For sequences that cycle, this value must be less than the number of values in the cycle. You cannot cache more values than will fit in a given cycle of sequence numbers. Therefore, the maximum value allowed for CACHE must be less than the value determined by the following formula:

(CEIL (MAXVALUE - MINVALUE)) / ABS (INCREMENT)

修改

要想修改自己的序列,你必須擁有ALTER SEQUENCE 權限;如果是修改其他用戶的序列,你則必須要擁有ALTER ANY SEQUENCE權限。下面,我們來看一下修改語法:

Oracle的sequence

刪除

要想刪除自己的序列,你必須擁有DROP SEQUENCE 權限;如果是刪除其他用戶的序列,你則必須要擁有DROP ANY SEQUENCE權限。下面,我們來看一下刪除語法:

Oracle的sequence

有關sequence的視圖

seq$

user_sequences

all_sequences

dba_sequences

seq

FAQ

如何增加sequence到指定的值?

由於sequence的值只能安裝增加的比例增加,所以一種方法就是利用plsq的循環來實現,如下:

declare

mein number;

begin

for i in 149 .. 2000 loop

select SEQ_BMW_PUNISH_PERMISSION_R_ID.nextval into mein from dual;

end loop;

dbms_output.put_line(\'ok\');

end;


分享到:


相關文章: