シーケンス

シーケンス(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 ;
-- 現在のシーケンス番号の取得(カウントアップしない)
SELECT ROUND_SEQ.CURRVAL FROM DUAL ;

シーケンス CACHE 20 の効果

シーケンスにおけるデフォルトのキャッシュサイズは 20 である。
この 20 、環境によるところが大きいとはいえ 20 以上を設定してもあまり効果は期待できそうにない。
きっと、なかなか適当な値(適した値)なのであろうと思う。
現在のサーバーのスペックであれば 10 位でもよさげではある。(いつから 20 なのだろう)

NOCACHE の状態で作業開始前にあらかじめ大量の発番がわかっている場合には、 作業の前後でキャッシュ値を変更するとバッチ処理などでは数秒から十数秒くらいは速くなるかもしれない (効果は すずめの涙 程度)。
直接的な効果は期待できないが再帰 SQL の発行回数が減少するので周りの環境にはやさしく?なるだろうと思う。

シーケンスをそこそこ大量に採番したときにかかった時間。小さいほど早いがキャッシュを 20 以上 とっても時間短縮度合いは鈍化している。

キャッシュサイズ時間
NOCACHE3,437
21,939
41,186
8696
16539
32426
64357
128329
256326
512303

デスクトップ PC サーバーの即席スクリプトで確認した結果ですので参考程度に見てください。(回数や時間単位は出さないようにしておきます)



 
日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle Web セミナー

*1 マニュアル上ではシーケンスは順序(番号)と書かれている。