• ベストアンサー

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

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

  • Oracle
  • 回答数7
  • ありがとう数16

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

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

namidame_dion
質問者

お礼

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

その他の回答 (6)

  • uresiiwa
  • ベストアンサー率45% (49/107)
回答No.7

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

namidame_dion
質問者

お礼

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

  • ttschool
  • ベストアンサー率28% (18/64)
回答No.6

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

namidame_dion
質問者

お礼

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

  • uresiiwa
  • ベストアンサー率45% (49/107)
回答No.5

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

  • trictrac
  • ベストアンサー率38% (10/26)
回答No.3

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

namidame_dion
質問者

お礼

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

回答No.2

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

namidame_dion
質問者

お礼

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

  • trictrac
  • ベストアンサー率38% (10/26)
回答No.1

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

namidame_dion
質問者

お礼

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

関連するQ&A

  • oracle sequence

    oracleのシーケンスでdual表からselect文のnextvalで取得したものをインサート したいのですが、ループ内で上記処理を複数回行ったときに、値が一回目以降 更新されずに困っています。 例) for (i=0;i < 5){ (1)セレクト文発行しシーケンスを取得。 (2)取得したシーケンスを変数にセット (3)インサート実行(主キーに取得したシーケンスをセット) } こんな感じで実行したときに、はじめはシーケンスが+1されますが、 それ以降シーケンスが増加しません。そのため、重複エラーが発生してしまいます。。。 どのように対処したらよいのかまったく見当がつきません。 大変申し訳ないのですが、ご教示いただきたくよろしくお願い申し上げます。

  • 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"));

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

    こんにちは。oracleのシーケンスについて教えてください。 次のようなシーケンスを作成します。 CREATE SEQUENCE SQC_TEST INCREMENT BY 1 START WITH 1 MAXVALUE 999999 MINVALUE 1 CASHE 20 CYCLE / この時、キャッシュ分の20という値は、いつどこでクリア?されるのか知りたいのです。 一番最初はシーケンスをクリエイトした時にキャッシュが20確保されると思うのですが、次にキャッシュが確保されるタイミングっていつなんでしょう? 最初の20を使い果たした時?それともシーケンスを作成してあるインスタンスをリブートした時?? というのは、設定したシーケンスが、実際発番していないのに一日ごとに20ずつカウントされていってるので原因をつきとめたいのです。 とりあえずはNOCACHEに設定してありますが、原因がわかれば、と思い質問させていただきました。 何かアドバイスいただけたらと思います。宜しくお願いいたします。

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

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

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

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

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

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

  • oracleのsequenceについて

    oracle masterのオラクル入門の勉強をしています。 知識があやふやなので教えてもらいたいのですが、 オブジェクトであるsequenceにアクセスできるのは 作成したユーザーのみ(そのスキーマ内)? or 複数のユーザー(全てのスキーマ内)でも可能? どちらでしょうか? スキーマの名前が変更されているかもしれませんが、 スキーマとユーザーは同じ意味ですよね?

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

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

  • Oracle:Oracleシーケンスとは?

    Oracleシーケンスとは何者なのでしょうか? なにやら番号のようなものですよねえ・・・たぶん ということで以下について教えて下さい。 1.シーケンスとは何ですか? 2.Oracleシーケンスとは何ですか? 3.どのようにOracleシーケンスを取得するのですか? 以上、宜しくお願いいたします。

  • oracle シーケンスの欠番を確認したい

    いつもお世話になります。 oracleのシーケンスの欠番を確認したいのですが、以下のようにサービス、インスタンスの再起動を試してみたのですが欠番はおきませんでした。 ・サービスの再起動 コントロールパネルから、サービスを開いて、「OracleServiceXE」、「OracleXETNSListener」の再起動。 シーケンスをselectした結果、欠番確認できず。 ・インスタンスの再起動 コマンドプロンプトを起動し、sqlplusから、sysdbaでoracleに接続。 shutdown、startupコマンドを行い、インスタンスを再起動。 シーケンスをselectした結果、欠番確認できず。 インスタンスの再起動を行えば欠番がおきる、というのをサイトで見たのですが、欠番は起きませんでした。なぜ起きないのでしょうか。 何か手順に不備があるのでしょうか。 alter system文による欠番は確認しています。 しかし、意図的にこのコマンドを発行しなければよいので、確認したいのは、通常運用時、データベースが起因してシーケンスの欠番が発生してしまう、ということです。 再起動などは普通に行うと思うので、その際に欠番が発生することを確認したいのです。 宜しくお願いします。 oracle:Oracle Database 11g Express Edition Release 11.2.0.2.0 OS:Windows Vista Home Promium 64bit