1. 程式人生 > >Oracle sequence簡介和性能測試

Oracle sequence簡介和性能測試

numbers 自己的 soft 我們 fault ins 信息 arc sel

一. 理論知識

先看一個創建Sequence的語句:

SQL> create sequence seq_tmp

2 increment by 1

3 start with 1

4 nomaxvalue

5 nocycle

6 ;

序列已創建。

相關參數說明:

INCREMENT BY 1 -- 每次加幾個

START WITH 1 -- 從1開始計數

NOMAXvalue -- 不設置最大值

NOCYCLE -- 一直累加,不循環

CACHE 10; --設置緩存cache個序列

CURRVAL=返回 sequence的當前值

NEXTVAL=增加sequence的值,然後返回 sequence 值

更多信息,參考Oracle 聯機文檔:

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

CACHENote:

CACHENOCACHE NOCACHECACHENOCACHEORDER to guarantee that sequence numbers are generated in order of request. This clause is useful if you are using the sequence numbers as timestamps. Guaranteeing order is usually not important for sequences used to generate primary keys.

ORDERNOORDER if you do not want to guarantee sequence numbers are generated in order of request. This is the default.

查看user_sequences 表的結構:

SQL> desc user_sequences;

名稱 是否為空? 類型

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

SEQUENCE_NAME NOT NULL VARCHAR2(30)

MIN_VALUE NUMBER

MAX_VALUE NUMBER

INCREMENT_BY NOT NULL NUMBER

CYCLE_FLAG VARCHAR2(1)

ORDER_FLAG VARCHAR2(1)

CACHE_SIZE NOT NULL NUMBER

LAST_NUMBER NOT NULL NUMBER

查看剛才創建的序列seq_tmp 的值:

SQL> select * from user_sequences where sequence_name=‘SEQ_TMP‘;

SEQUENCE_N MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER

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

SEQ_TMP 1 1.0000E+28 1 N N 20 21

這裏有個CACHE_SIZE的值。 我們在創建sequence的時候,啟用了cache,但是沒有給它值。 所以這裏的cache_size 就是系統的模式值。 即20個。

取下一個sequence的值:

SQL> select seq_tmp.nextval from dual;

NEXTVAL

----------

1

SQL> select seq_tmp.nextval from dual;

NEXTVAL

----------

2

查看當前sequence的值:

SQL> select seq_tmp.currval from dual;

CURRVAL

----------

修改Cache 大小:

如果Cache已經指定,我們可以修改Cache 大小。 alter 命令可以修改sequence中除了start 以外的所有參數。

如:

alter sequence emp_sequence cache 100;

select * from user_sequences where sequence_name=upper(‘emp_sequence‘);

二. 實驗

一個網友RAC 系統上的測試時結果:

nocache:    2100s

cache =1000:   55s

差別很明顯。

測試一:

SQL> create sequence seq_1 nocache;

序列已創建。

SQL> set timing on;

SQL> declare

2 x number;

3 begin

4 for i in 1 .. 10000 loop

5 select seq_1.nextval into x from dual;

6 end loop;

7 end;

8 /

PL/SQL 過程已成功完成。

已用時間: 00: 00: 02.26

測試二:

SQL> create sequence seq_2 cache 20;

序列已創建。

已用時間: 00: 00: 00.01

SQL> declare

2 x number;

3 begin

4 for i in 1 .. 10000 loop

5 select seq_2.nextval into x from dual;

6 end loop;

7 end;

8 /

PL/SQL 過程已成功完成。

已用時間: 00: 00: 00.46

測試三:

SQL> create sequence seq_3 cache 100;

序列已創建。

已用時間: 00: 00: 00.05

SQL> declare

2 x number;

3 begin

4 for i in 1 .. 10000 loop

5 select seq_3.nextval into x from dual;

6 end loop;

7 end;

8 /

PL/SQL 過程已成功完成。

已用時間: 00: 00: 00.37

測試四:

SQL> create sequence seq_4 cache 1000;

序列已創建。

已用時間: 00: 00: 00.04

SQL> declare

2 x number;

3 begin

4 for i in 1 .. 40000 loop

5 select seq_4.nextval into x from dual;

6 end loop;

7 end;

8 /

PL/SQL 過程已成功完成。

已用時間: 00: 00: 01.31

SQL> declare

2 x number;

3 begin

4 for i in 1 .. 40000 loop

5 select seq_1.nextval into x from dual;

6 end loop;

7 end;

8 /

PL/SQL 過程已成功完成。

已用時間: 00: 00: 09.33

SQL>

小結:

在自己的本本上測試的,Oracle 11gR2. 單Instance數據庫單會話循環不間斷取1-4萬個值。

nocache: 2.26s 10000   

cache:20 0.46s 10000

cache:100 0.37s 10000

cache:1000 1.31s 40000

nocache: 9.33s 40000

基本上cache 大於20的時候性能基本可以接受,nocache的時候性能確實很差.

該文引自:http://blog.csdn.net/tianlesoftware/article/details/5995051

Oracle sequence簡介和性能測試