Oracle シーケンスのデフォルトはNOORDERである罠
Oracleのシーケンスを使っていて見事にハマったのでメモ。
Oracle には MySQL の AUTO_INCREMENT
のようなテーブルのIDを自動採番する機能はないので、同じことをやりたければ「シーケンス」という一意な整数を生成してくれるオブジェクトを使用します。場合によっては欠番が発生することがあるので、それを意識して使用する必要があります。
欠番は意識していたのですが、 1, 2, 3, 21, 4, 22
のように採番される番号に「戻り」が発生し、かなり焦りました。
早い話、RAC(複数のインスタンスで一つのデータベースを構成する Oracle Database のクラスタリング構成)を組んでいる場合、デフォルトのオプションのままシーケンスを作ると「番号の戻り」が発生します。
SHIFT the Oracle さんに詳しい説明があるのですが、
- シーケンスのジェネレータはインスタンス毎に存在する
- シーケンスのデフォルトオプションが
CACHE 20
/NOORDER
であるので、ロードバランスで振られるインスタンスが変わると、採番される数値が急に飛んだり、前回より小さくなる現象が発生します。重複する数値は採番されないので、アイデンティティという意味では問題はありませんが、発行された数値でデータの作成順を意識する作りをしていると問題になります。
要求順通りに採番されるようにするには CREATE SEQUENCE
時に NOCACHE
/ ORDER
を指定します。キャッシュされなくなるので速度面での劣化はあるように思います。
いやーマジで焦った。公式マニュアル も見てね。