1. 程式人生 > >Oracle Sequence Cache 引數說明

Oracle Sequence Cache 引數說明

   公司上線一套RAC 系統。 Aston對Sequence 的 Cache 引數表示關注,建議併發大的系統對Cache設定大一點。 這樣可以提高效能。 和Aston 討論了一下。 又從網上查了一下。

之前整理的一篇文章。 剛才看了一下,也是從網上轉的。 那是還是寫blog初期的作品。 2009年10月份的。 轉眼一年,寫Blog 也比以前成熟了很多。

一. 理論知識

先看一個建立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的時候效能確實很差.