- ベストアンサー
オラクルのシーケンスについて
オラクルのシーケンスですがCACHEを指定しないときはデフォルト20がとられるとのことですが、NEXTVALで採番したシーケンスがいきなり増分20で返されることはあるのでしょうか。 ex.1からNEXTVAL後21が戻される
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
他の回答のまとめっぽくなりますが、 CACHEがらみで起きる番号飛びは以下のパターンがあります。 seq_XX: start with 0 incremented by 1 cache 20 1. seq_XXnextval実行 → 1 2-A.インスタンス再起動 or 2-B. 共有プールクリア(alter system flush shared_pool) 3. seq_XXnextval実行 → 21 (想像で書いたので数値が1ズレてたりしたらごめんなさい) 2-Bは、シーケンスを共有プールに固定(dbms_shared_pool.keep)することで回避可能ですが、2-Aは回避不可能です。 かといって、CACHEしないと採番のたびに毎回オブジェクトアクセスが発生するので、パフォーマンス的にトレードオフとなってしまいますね。(かなり頻繁にアクセスしないのであれば、気にならない程度だと思いますが)
その他の回答 (6)
- uresiiwa
- ベストアンサー率45% (49/107)
No.5ですが、補足です。 「共有プールクリアは勝手には行われない」と書きましたのは、 「”alter system flush shared pool”は勝手には行われない」という意味で、No.6様のおっしゃるとおり、あまりアクセスされないオブジェクトがキャッシュアウトすることはありえます。 そういった場合は、CACHE確保していた分、シーケンス番号が飛ぶことになりますね。
お礼
No5のご回答とあわせてありがとうございました。よくわかりました。
- ttschool
- ベストアンサー率28% (18/64)
共有プールのキャッシュ情報が削除されるタイミング 管理方式は、バッファキャッシュなどと同じです。 すなわち、「使用されてから最も時間が経過した」データを共有プールから削除します。(共有プールのキャッシュが不足した場合) アルゴリズムでいうと、LRUリストです。
お礼
そうなんですね。複数シーケンスオブジェクトを利用している場合は番号とびしやすいということでしょうか。的確なご回答ありがとうございます。
- uresiiwa
- ベストアンサー率45% (49/107)
>共有プールクリアってoracleが勝手に行うのでしょうか? 勝手に行われることは決してありません。 また、ALTER SYSTEM権限が必要となるので、一般ユーザでは実行不可能です。(SYS,SYSTEMやDBA権限を付与されたユーザなどであれば可能)
- trictrac
- ベストアンサー率38% (10/26)
ちなみに、インスタンス再起動しなくても キャッシュが破棄される場合もありますよ。 どうしても保障したい場合は、CACHEを1にして置くと良いと思います。 但し、CACHEが1でも100%は保障できないので、 欠番は発生しますが。
お礼
へーえ、CASHE1でも欠番が発生するときがあるんですか。 知りませんでした。解説ありがとうございました。
- ossan_hiro
- ベストアンサー率66% (88/132)
DBインスタンスを再起動した際に、キャッシュされていた分が クリアされてしまい、次のNEXTVALで番号が抜ける場合が あります。 ex) seq.nextval = 3 ⇒ 再起動 ⇒ seq.nextval = 21 また共有プールのメモリフラッシュなどによっても、キャッシュ されているシーケンスが抜ける場合などもあります。 共有プールのメモリフラッシュはシーケンスをPINしておけば 回避することができます。
お礼
わかりやすいご回答ありがとうございます。 PINて何でしょうか?
- trictrac
- ベストアンサー率38% (10/26)
NEXTVALはincrement byで指定した分でしか 戻されませんよ。
お礼
速攻でお返事いただき、ありがとうございました。 キャッシュ指定の場合、飛ぶこともあるみたいなんです。
お礼
詳しい説明ありがとうございました。 共有プールクリアってoracleが勝手に行うのでしょうか?