こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

オラクルのシーケンスについて

オラクルのシーケンスですがCACHEを指定しないときはデフォルト20がとられるとのことですが、NEXTVALで採番したシーケンスがいきなり増分20で返されることはあるのでしょうか。
ex.1からNEXTVAL後21が戻される

投稿日時 - 2009-02-09 23:38:17

QNo.4704095

すぐに回答ほしいです

質問者が選んだベストアンサー

他の回答のまとめっぽくなりますが、
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しないと採番のたびに毎回オブジェクトアクセスが発生するので、パフォーマンス的にトレードオフとなってしまいますね。(かなり頻繁にアクセスしないのであれば、気にならない程度だと思いますが)

投稿日時 - 2009-02-11 13:16:10

お礼

詳しい説明ありがとうございました。
共有プールクリアってoracleが勝手に行うのでしょうか?

投稿日時 - 2009-02-12 23:30:14

このQ&Aは役に立ちましたか?

10人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.7

No.5ですが、補足です。
「共有プールクリアは勝手には行われない」と書きましたのは、
「”alter system flush shared pool”は勝手には行われない」という意味で、No.6様のおっしゃるとおり、あまりアクセスされないオブジェクトがキャッシュアウトすることはありえます。
そういった場合は、CACHE確保していた分、シーケンス番号が飛ぶことになりますね。

投稿日時 - 2009-02-15 23:24:00

お礼

No5のご回答とあわせてありがとうございました。よくわかりました。

投稿日時 - 2009-02-19 06:59:47

ANo.6

共有プールのキャッシュ情報が削除されるタイミング

管理方式は、バッファキャッシュなどと同じです。
すなわち、「使用されてから最も時間が経過した」データを共有プールから削除します。(共有プールのキャッシュが不足した場合)
アルゴリズムでいうと、LRUリストです。

投稿日時 - 2009-02-15 21:21:04

お礼

そうなんですね。複数シーケンスオブジェクトを利用している場合は番号とびしやすいということでしょうか。的確なご回答ありがとうございます。

投稿日時 - 2009-02-19 06:58:36

ANo.5

>共有プールクリアってoracleが勝手に行うのでしょうか?

勝手に行われることは決してありません。

また、ALTER SYSTEM権限が必要となるので、一般ユーザでは実行不可能です。(SYS,SYSTEMやDBA権限を付与されたユーザなどであれば可能)

投稿日時 - 2009-02-13 20:14:44

ANo.3

ちなみに、インスタンス再起動しなくても
キャッシュが破棄される場合もありますよ。

どうしても保障したい場合は、CACHEを1にして置くと良いと思います。
但し、CACHEが1でも100%は保障できないので、
欠番は発生しますが。

投稿日時 - 2009-02-11 10:25:41

お礼

へーえ、CASHE1でも欠番が発生するときがあるんですか。
知りませんでした。解説ありがとうございました。

投稿日時 - 2009-02-12 23:34:17

ANo.2

DBインスタンスを再起動した際に、キャッシュされていた分が
クリアされてしまい、次のNEXTVALで番号が抜ける場合が
あります。
ex) seq.nextval = 3 ⇒ 再起動 ⇒ seq.nextval = 21

また共有プールのメモリフラッシュなどによっても、キャッシュ
されているシーケンスが抜ける場合などもあります。
共有プールのメモリフラッシュはシーケンスをPINしておけば
回避することができます。

投稿日時 - 2009-02-10 09:30:47

お礼

わかりやすいご回答ありがとうございます。
PINて何でしょうか?

投稿日時 - 2009-02-12 23:32:50

ANo.1

NEXTVALはincrement byで指定した分でしか
戻されませんよ。

投稿日時 - 2009-02-10 07:31:56

お礼

速攻でお返事いただき、ありがとうございました。
キャッシュ指定の場合、飛ぶこともあるみたいなんです。

投稿日時 - 2009-02-12 23:31:43

あなたにオススメの質問