Oracle Database 18c の新機能 Scalable Sequence を検証します。
Scalable Sequence とは
SEQUENCE オブジェクトは一意な数値を生成するオブジェクトです。指定された番号と増分により NEXTVAL と CURRVAL 疑似列を使って値取得することができます。
テーブルの主キーとして自動採番用に SEQUENCE を使い、データの一括ロードを行う場合、順序値として近い値が大量に生成されることがあります。近い値が大量に挿入されると、インデックスの同一ブロックに書き込みが集中するといった問題があります。
Oracle Database 18c では、従来の SEQUENCE を拡張し、シーケンス値にインスタンス番号とセッション番号を付加することでセッション単位に離れた値を生成することができるようになりました。
Scalable Sequence の作り方
拡張されたSEQUENCEを作成するには、CREATE SEQUENCE 文に SCALE 句を指定します。START WITH で指定された値の上位ビットにセッション番号から生成された数値が付加されます。
SQL> CREATE SEQUENCE seq_scale1 START WITH 1 SCALE;
Sequence created.
SQL> SELECT TO_CHAR(seq_scale1.NEXTVAL) FROM DUAL;
TO_CHAR(SEQ_SCALE1.NEXTVAL)
----------------------------------------
1010190000000000000000000001
別セッションからシーケンス値を取得すると、大きく異なる値が取得できることがわかります。
SQL> SELECT TO_CHAR(seq_scale1.NEXTVAL) FROM DUAL;
TO_CHAR(SEQ_SCALE1.NEXTVAL)
----------------------------------------
1013930000000000000000000002
デフォルトでは、SEQUENCE オブジェクトが使う領域の上位6桁をセッション単位に更新します。拡張領域を従来の SEQUENCE の「範囲外」に持つ設定が CREATE SEQUENCE 文の SCALE EXTEND 設定です。下記の例では SCALE EXTENDED を指定した SEQUENCE の桁数が増えていることがわかります。
SQL> CREATE SEQUENCE seq_extend START WITH 1 SCALE EXTEND;
Sequence created.
SQL> SELECT TO_CHAR(seq_extend.NEXTVAL) FROM DUAL;
TO_CHAR(SEQ_EXTEND.NEXTVAL)
----------------------------------------
1010190000000000000000000000000001
ALTER SEQUENCE 文で属性を変更することもできます。EXTEND 句を解除するには ALTER SEQUENCE SCALE NOEXTEND 文を実行します。SCALE 句を解除するには ALTER SEQUENCE NOSCALE 文を実行します。
SQL> ALTER SEQUENCE seq_scale1 NOSCALE;
Sequence altered.
SQL> ALTER SEQUENCE SEQ_EXTEND SCALE NOEXTEND;
Sequence altered.
確認方法
設定の確認は、ALL_SEQUENCES ビュー(DBA_SEQUENCE / USER_SEQUENCE)の SCALE_FLAG 列(SCALE 句の指定 = 'Y')と、EXTEND_FLAG 列(EXTEND 句の指定 = 'Y')で確認できます。
SQL> SELECT SEQUENCE_NAME, SCALE_FLAG, EXTEND_FLAG FROM USER_SEQUENCES;
SEQUENCE_NAME S E
------------------------------ - -
SEQ_EXTEND Y Y
SEQ_SCALE1 Y N
マニュアルには CREATE SEQUENCE 文に SCALE 句を指定する場合には ORDER 句と併用しないことを推奨していますが、SQL 文としては実行可能です。
SQL> CREATE SEQUENCE seq_not_recommended SCALE ORDER;
Sequence created.