Oracle Database 18c 新機能: スケーラブルな順序

*以下は、サポート契約締結中のお客様に毎月配信しているサポートレターより一部抜粋して掲載しています。

18c 新機能: スケーラブルな順序

Oracle Database の順序 (sequence) は古くからある機能であり、例えば主キー列にユニークな数値を格納したい場合等に便利な機能ですが、以下のように性能面でネックとなる場合がありました。

  • B*Tree 索引が付与されている列に、順序から取得した数値を連続して挿入すると、索引の中で最も大きな値を格納するブロックにアクセスが集中する。

このようなアクセスの集中を回避するための主な対策としては、Oracle Database 12.2 までのバージョンでは以下が挙げられます。

  1. 逆キー索引を用いる
  2. ハッシュ・パーティション索引を用いる

確かにこれらの対策を用いることにより特定の索引ブロックにアクセスが集中することを防ぐことが可能ですが、逆キー索引・ハッシュ・パーティション索引のどちらを用いても範囲検索時に索引が利用されないといったデメリットもありました。そこでスケーラブルな順序の出番となります。

スケーラブルな順序の概要

スケーラブルな順序では、特定の索引ブロックへのアクセスの集中を防ぐために、順序から取得できる値が分散される仕組みになっています。具体的には以下のような数値が取得されます。

①: (instance id % 100) + 100 で求められる 3 桁の数値
②: session id % 1000 で求められる 3 桁の数値
③: 従来の順序で取得できる 1,2,3,4 ... といった数値

スケーラブルな順序の作成

create sequence コマンドで作成するところは従来の順序と同じですが、スケーラブルな順序の場合はキーワード "scale" を付与して作成します。

それでは実際にスケーラブルな順序を作成してみましょう。上述の③の部分で従来の順序と同じ桁数を保持したい場合はキーワード "extend" も付与します。

SQL> create sequence seq1 maxvalue 9999999 scale extend;

順序が作成されました。

SQL> set numformat 9999999999999
SQL> select seq1.nextval from dual;

       NEXTVAL
--------------
 1010370000001

上述の説明と同様、①②③の 3 つのブロックに分けて考えると下記のようになります。
キーワード "extend" を付与したので、maxvalue に指定した 7 桁が③の部分に割り当てられています。

キーワード "extend" ではなく "noextend" を付与すると、①②③全て合わせた桁数がmaxvalue で指定した 7 桁になります。下記の通り実施してみます。

SQL> create sequence seq2 maxvalue 9999999 scale noextend;

順序が作成されました。

SQL> set numformat 999999999
SQL> select seq2.nextval from dual;

   NEXTVAL
----------
   1010371

このように、①②の部分で 6 桁が割り当てられますので、③の部分には 1 桁しか割り当てられない結果となります。このように実質使える桁数は少なくなってしまいますので注意が必要ですが、既存のアプリケーションや表で定義されている最大桁数を変更したくない場合はこのようにキーワード "noextend" を用いるとよいでしょう。

まとめ

今号では、Oracle Database 18c 新機能の一つであるスケーラブルな順序について紹介させていただきました。ぜひ性能問題対策の一つとしてご検討いただければと思います。

(オラクル事業部 サポート・サービス担当 長谷川)

Oracle Database 18c 新機能: スケーラブルな順序