アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

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

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

お礼日時:2009/02/12 23:30

No.5ですが、補足です。


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

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

お礼日時:2009/02/19 06:59

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



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

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

お礼日時:2009/02/19 06:58

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



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

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

ちなみに、インスタンス再起動しなくても


キャッシュが破棄される場合もありますよ。

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

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

お礼日時:2009/02/12 23:34

DBインスタンスを再起動した際に、キャッシュされていた分が


クリアされてしまい、次のNEXTVALで番号が抜ける場合が
あります。
ex) seq.nextval = 3 ⇒ 再起動 ⇒ seq.nextval = 21

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

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

お礼日時:2009/02/12 23:32

NEXTVALはincrement byで指定した分でしか


戻されませんよ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/02/12 23:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!