Oracle Sequence Cacheパラメータ説明【daveアイドル大神】
原文のリンク:http://blog.csdn.net/tianlesoftware/article/details/5995051
一. 理論知識
まず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から数え始めます
NO MAX value-- 最大値を設定しない
NOCYCLE-- ずっと積み重ねて、循環しません。
CACHE 10 --キャッシュcacheのシーケンスを設定します。
CURRVAL=戻ります sequenceの現在値
NEXTVAL=sequenceの値を追加して返します。 sequence 値
詳細はOracleを参照してください。 オンラインドキュメント:
CACHE CACHE(CEIL(MAX VALE-MINVALE)/ABS(INCREMENT)
CACHENote:
CACHENOC ACHE NOCACHECACHENOCACHEORDER to gurarantee that sequence numbers are generated in order of request.This clause is useful Youre using the sequence numbers as timestamps.Garanteeing order is usualy noimport for sequence marketed.
user_を確認しますsequences テーブルの構造:
SQL>desc user_sequences
名前 空ですか タイプ
----------------------------------------- -------- ---------------
SEQUENCE_NAME NOT NULL VRCHARR 2(30)
MIN_VALE NUMBER
MAX_VALE NUMBER
INCREMENT_BY。 NOT NULL NUMBER
CYCLE_FLAG VRC HAR 2(1)
ORDER_FLAG VRC HAR 2(1)
CACHE_SIZE NOT NULL NUMBER
ラスト.NUMBER NOT NULL NUMBER
先ほど作成したシーケンスを確認します。tmp の値:
SQL> select*from user_sequences where sequence uname='SEQ_TMP;
SEQUENCE_N MIN_VALE MAX_VALE INCREMENT_BY C O CACHE_SIZE ラスト.NUMBER
-------------------------------------------------
SEQ_TMP 1 1.0000 E+28 1 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 uname=uper('empquence')
二. 実験
一人のネット友達RAC システム上のテスト時の結果:
nocache: 2100 s
cache =1000: 55 s
差が歴然としている
テスト1:
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
テスト2:
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
テスト3:
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 11 gR 2です。 単一Instanceデータベースの単一セッションの循環は1-4万個の値を連続的に取ります。
nocache: 2.26 s 10000
cache:20 0.46 s 10000
cache:100 0.37 s 10000
cache:1000 1.31 s 40000
nocache: 9.33 s 40000
基本的にcache 20より大きい時は性能が大体受け入れられます。nocacheの時は性能が悪いです。
一. 理論知識
まず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から数え始めます
NO MAX value-- 最大値を設定しない
NOCYCLE-- ずっと積み重ねて、循環しません。
CACHE 10 --キャッシュcacheのシーケンスを設定します。
CURRVAL=戻ります sequenceの現在値
NEXTVAL=sequenceの値を追加して返します。 sequence 値
詳細はOracleを参照してください。 オンラインドキュメント:
CACHE CACHE(CEIL(MAX VALE-MINVALE)/ABS(INCREMENT)
CACHENote:
CACHENOC ACHE NOCACHECACHENOCACHEORDER to gurarantee that sequence numbers are generated in order of request.This clause is useful Youre using the sequence numbers as timestamps.Garanteeing order is usualy noimport for sequence marketed.
ORDER
NOORDER if you do not want to garantee sequence numbers are e generated in order of request.This is the default.user_を確認しますsequences テーブルの構造:
SQL>desc user_sequences
名前 空ですか タイプ
----------------------------------------- -------- ---------------
SEQUENCE_NAME NOT NULL VRCHARR 2(30)
MIN_VALE NUMBER
MAX_VALE NUMBER
INCREMENT_BY。 NOT NULL NUMBER
CYCLE_FLAG VRC HAR 2(1)
ORDER_FLAG VRC HAR 2(1)
CACHE_SIZE NOT NULL NUMBER
ラスト.NUMBER NOT NULL NUMBER
先ほど作成したシーケンスを確認します。tmp の値:
SQL> select*from user_sequences where sequence uname='SEQ_TMP;
SEQUENCE_N MIN_VALE MAX_VALE INCREMENT_BY C O CACHE_SIZE ラスト.NUMBER
-------------------------------------------------
SEQ_TMP 1 1.0000 E+28 1 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 uname=uper('empquence')
二. 実験
一人のネット友達RAC システム上のテスト時の結果:
nocache: 2100 s
cache =1000: 55 s
差が歴然としている
テスト1:
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
テスト2:
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
テスト3:
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 11 gR 2です。 単一Instanceデータベースの単一セッションの循環は1-4万個の値を連続的に取ります。
nocache: 2.26 s 10000
cache:20 0.46 s 10000
cache:100 0.37 s 10000
cache:1000 1.31 s 40000
nocache: 9.33 s 40000
基本的にcache 20より大きい時は性能が大体受け入れられます。nocacheの時は性能が悪いです。