シーケンス
シーケンス(SEQUENCE)とは Oracle によって提供されている高速に連番(※)を発行するための仕組みである*1。この機構にはシーケンス・ジェネレータ(順序生成装置?)という立派な名前も付いている。シングルインスタンス環境では番号をキャッシュしているだけにみえるが、RAC(Real Application Cluster) の環境の ORDER 付きのシーケンスの場合には、舞台裏でなにやら調整しているようである。
(※) 増分値を設定すれば飛び番の採番も可能
シーケンスの構文
CREATE SEQUENCE sequence_name
[ INCREMENT BY integer (INCREMENT BY 1) ]
[ START WITH integer (START WITH 1) ]
[ NOMAXVALUE | MAXVALUE integer ]
[ NOMINVALUE | MINVALUE integer ]
[ NOCYCLE | CYCLE ]
[ NOCACHE | CACHE integer (CACHE 20) ]
[ NOORDER | ORDER ]
(省略した場合には太字が設定される)
シーケンスの作成例
-- 何も指定しないことも可能
CREATE SEQUENCE RIVUS.SIMPLE_SEQ ;
-- 0〜9 を巡回するシーケンス
CREATE SEQUENCE RIVUS.ROUND_SEQ
INCREMENT BY 1
START WITH 0
MAXVALUE 9
MINVALUE 0
CYCLE
NOCACHE
ORDER ;
-- シーケンスの取得 (NEXTVAL 擬似列)
SELECT ROUND_SEQ.NEXTVAL FROM DUAL ;
シーケンス CACHE 20 の効果
シーケンスにおけるデフォルトのキャッシュサイズは 20 である。
この 20 、環境によるところが大きいとはいえ 20 以上を設定してもあまり効果は期待できそうにない。
きっと、なかなか適当な値(適した値)なのであろうと思う。
現在のサーバーのスペックであれば 10 位でもよさげではある。(いつから 20 なのだろう)
NOCACHE の状態で作業開始前にあらかじめ大量の発番がわかっている場合には、
作業の前後でキャッシュ値を変更するとバッチ処理などでは数秒から十数秒くらいは速くなるかもしれない
(効果は すずめの涙 程度)。
直接的な効果は期待できないが再帰 SQL の発行回数が減少するので周りの環境にはやさしく?なるだろうと思う。
| キャッシュサイズ | 時間 |
| NOCACHE | 3,437 |
| 2 | 1,939 |
| 4 | 1,186 |
| 8 | 696 |
| 16 | 539 |
| 32 | 426 |
| 64 | 357 |
| 128 | 329 |
| 256 | 326 |
| 512 | 303 |
デスクトップ PC サーバーの即席スクリプトで確認した結果ですので参考程度に見てください。(回数や時間単位は出さないようにしておきます)