• ベストアンサー
  • すぐに回答を!

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

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

共感・応援の気持ちを伝えよう!

  • 回答数7
  • 閲覧数3534
  • ありがとう数16

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

  • ベストアンサー
  • 回答No.4

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

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

    オラクルの連番(シーケンス)の振り方について一つお聞きしたい事がございます。 Insert時にシーケンスを使い、0から100まで順に連番を振りたいの ですが、100に到達する前に、あるタイミングで現在値を0に戻して 再び1から連番を振りたいんです。 ちなみにあるタイミングを、下記に簡単に例として書きます。 (1)ファイルから1レコードずつデータを読み込む。  (1)初回は何もチェックせずInsertをし、先頭から4バイトまでの値を変数に格納  (2)2レコード目以降は、先頭から4バイトまでの値を前回の値(変数)と比較   True(値が同じ)  ⇒順番に連番を振る   False(値が違う)  ⇒新たに0から連番を振る。              変わった値を変数に格納する。 (2)Insertをする。 私の知っている知識で行けば、シーケンスは1テーブルで一つのシーケンス しか使用できなかったはずですが・・・なにぶん知識がないので、もしか したら出来たのかな?と思ったので質問しました。 上に書いた事が可能であるかどうか教えてください。 よろしくお願いします。

  • postgresのシーケンスについて

    postgresのSEQUENCEを使って伝票番号を採番しています。 しかし、このシーケンスは時々、勝手にとび番となってしまい困っています。 もちろんCACHEは1としています。 プログラムが悪いのかデータベースの設定に誤りがあるのか不明な 状況です。何か調査の方法があれば教えて下さい。

  • オラクルのデフォルトセッション数

    オラクルのsessionsのデフォルト値はいくつですか?

その他の回答 (6)

  • 回答No.7

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

  • 回答No.6

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

  • 回答No.5

>共有プールクリアってoracleが勝手に行うのでしょうか? 勝手に行われることは決してありません。 また、ALTER SYSTEM権限が必要となるので、一般ユーザでは実行不可能です。(SYS,SYSTEMやDBA権限を付与されたユーザなどであれば可能)

共感・感謝の気持ちを伝えよう!

  • 回答No.3

ちなみに、インスタンス再起動しなくても キャッシュが破棄される場合もありますよ。 どうしても保障したい場合は、CACHEを1にして置くと良いと思います。 但し、CACHEが1でも100%は保障できないので、 欠番は発生しますが。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

  • 回答No.2

DBインスタンスを再起動した際に、キャッシュされていた分が クリアされてしまい、次のNEXTVALで番号が抜ける場合が あります。 ex) seq.nextval = 3 ⇒ 再起動 ⇒ seq.nextval = 21 また共有プールのメモリフラッシュなどによっても、キャッシュ されているシーケンスが抜ける場合などもあります。 共有プールのメモリフラッシュはシーケンスをPINしておけば 回避することができます。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

  • 回答No.1

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • POSTGRESQLデフォルトのシーケンス値を強制

    以下の(2)(3)のaをデフォルトであるシーケンスの値を強制入力しエラーを回避する方法はありますか? create sequence testseq start 1; create table test(a int not null default nextval('testseq'), b int); --(1)成功 insert into test (b) values(0); --(2)エラー insert into test (a,b) values(null,0); --(3)エラー insert into test values(null,0);

  • オラクルのエクスポートについて

    いつもお世話になっています。さっそく質問ですが、 オラクルのエクスポートをユーザーモードでした場合に、 いったいどこまで、エクスポートされるのでしょうか? 表定義、シーケンスなどのオブジェクトや権限はもちろん のこと、別のユーザーにそのエクスポートファイルを インポートした時にエクスポートされたユーザーとまったく 同じ環境になるのですか? 実際にインポートしてみたはいいものの自分が作った ユーザーではないので、確認がとりづらいのです。 どうか、未熟な私にお教え願えないでしょうか?

  • SQL シーケンスについて

    Orcle8iを使用しています。 INSERT INTO SELECT で別のテーブルのデータを追加したいのですが、そのうち1つフィールドには、シーケンスオブジェクトで取得した値を入れたいと思っていますが、INSERT文が作れません・・・。 例えば ----------------------------- INSERT INTO TABLE1(FIELD1,FIELD2,FIELD3)   SELECT --SELECT SEQ.NEXTVAL FROM DUAL??--     FIELD1_2,     FIELD1_3 FROM TABLE2 WHERE FILED1_2='X'; ----------------------------- という場合、TABLE1のFIELD1に連番を入れたいのですが 書き方が分かりません。 http://www.okweb.ne.jp/kotaeru.php3?q=347146 上記URLの質問に、シーケンスのSELECT文を副問い合わせにして・・・という回答があったのですが、それもよく理解できませんでした・・・(T_T) シーケンスのSELECT文をどう埋め込めば良いのでしょうか? どなかた教えていただけませんか? よろしくお願いします。

  • SQLServerでOracleシーケンスのような機構を実現するには

    いつもお世話になります。 SQLServerで自動採番される仕組みで何かいい方法がないかどうか悩んでいます。 主キーとなる項目に自動採番された値を、アプリケーションでセットした上で、DBに追加する仕組みを考えています。 OracleではSequenceのnextvalなどを使用すれば、番号を自動採番したものを取得することが可能ですが、 SQLServerでこのような仕組みを実現するために何か良い方法はありませんでしょうか? (追加先のDBはSQLServerではなく、自動採番等の機能も無いため、追加する前にアプリケーションでセットする必要がある。) 今までOracleしか使用したことが無く、SQLServerは初めてなので、ご教授頂きたく投稿しました。 よろしくお願いします。 SQLServerは2005を使用しています。

  • シーケンスソフトについて

    最近、MIDIでの曲の演奏に興味を持ち始めて「ミノ式MIDIシーケンサ」を使い制作をしてきましたが、 スタンダートキットだけではなく他のドラムの音色も使いたいと思いました。 しかし「ミノ式MIDIシーケンサ」はドラムの指定などが出来ないため、 スタンダートキットのみ使用しなければなりません。 なので、シーケンスソフトを変更しようと考えています。 ・ミノ式MIDIシーケンサのように打ち込みやすい画面 ・ピッチベンド・モジュレーションなどのエフェクトの設定がやりやすい ・ドラムの指定が出来る これらを備えたシーケンスソフトをご存知の方、よろしくお願いします。

  • オラクルのテーブルでの入力制限

    こんにちは。教えてください。 小職はオラクルデータベースを使って銀行振り込みファームバンキングをする プログラムを作成しています。 出力項目の振り込み名義人名カナは小文字のみ指定です。 そこでオラクルのテーブルに小文字しか入力できない制限を指定したいのですが ご存じの方は教えてください。 オラクル側で入力制限を行うのが一番堅いと思います。 よろしくお願いします。 (^^

  • Oracleのシーケンスありのテーブル作成について

    Oracleのテーブルを作るのに、ある列を自動で「全体の通し番号」みたいなユニーク(一意)な番号を振りたいく、 シーケンス(sequence)を作成しテーブルを作ろうとしているのですがうまくいきません。 どこがわるいのでしょうか。 create sequence "yamaaf_seq"; CREATE TABLE TBL_AFFILIATE_SESS( UNIQ_ID NUMBER(11,0) DEFAULT nextval('yamaaf_seq') NOT NULL, ORG_CODE VARCHAR2(64) NOT NULL, primary key("UNIQ_ID"));

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

    オラクルのSEQUENCEを使いたいのですが 作り方(CREATE文)が分かりません。 また出来上がったSEQUENCEはどのように 使うのでしょうか。

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

    CREATE SQUENCE でSTART WITHを初期値を設定しなかった場合の 初期値についてですが、本で調べたのですが、それぞれ書いてある事が違います。 (1)初期値は1 (2)初期値は、昇順の場合、NOMINVALUE(デフォルト 1)       降順の場合、NOMAXVALUE(デフォルト -1) どっちがただしいですか? 来週試験をうけるので、至急お願いします

  • オラクルのエラー番号、エラーメッセージ

    超初心者です。 オラクルのエラー番号、エラーメッセージ それぞれの最大レングスはいくらですか? エラー時にエラー番号とエラーメッセージを 変数に格納したいのですがサイズをいくつに 指定して良いわからなかったため、、、、 すいませんが、どなたか教えて下さい。