順序の使用方法

複数のユーザーが一意のBIGINTデータ型を生成するために使用できる新しい順序番号ジェネレータが、CREATE SEQUENCE文によって作成されます。マテリアライズド・ビューおよび表と同様、順序オブジェクトを作成すると、データベースの任意の要素から順序値を取得できます。

値が取得されるたびに順序オブジェクトでグローバルに調整された更新を実行するオーバーヘッドを削減するために、値は順序からブロックで取得され、キャッシュされます。TimesTen Scaleoutで順序から返される値は一意であることが保証されている一方で、連続していることは保証されていません。

BATCH句は、TimesTen Scaleoutに固有のものです。バッチ値によって、要素に格納された一意の順序値の範囲が構成されます。各要素にはその独自のバッチがあります。要素のローカル・バッチが消費されると、要素は新しいバッチを取得します。順序を所有し、バッチ順序ブロックを他の要素に割り当てる責任を担う要素が1つあります。

順序値は一意ですが、この値は要素をまたいで単調な順番では返されない可能性があります。1つの要素内では、順序値の順番は単調です。ただし、時間の経過に伴い、要素をまたいでは順序値は単調に返されません。ただし、単調なプロパティは、1つの要素内では保証されます。

アプリケーションがイベントを記録し、順序値で各イベントにタグ付けする場合、たとえば、アプリケーションではイベント100がイベント80の後に発生することを想定できません。アプリケーションでこのように想定する必要がある場合は、BATCHを1に設定します。ただし、BATCHを1に設定すると、かなりの通信のオーバーヘッドが発生します。

つまり、BATCH値が1に設定されていない場合、順序値の順番がすべての要素をまたいで維持されることは保証されません。ただし、バッチ値が何であっても、順序値の一意性がすべての要素をまたいで維持されることは保証されます。また、順序値の順番が1つの要素内で維持されることは保証されます。

既存の順序のデフォルトのバッチ値を変更するには、ALTER SEQUENCE文を発行します。バッチ値は、変更可能な唯一の句です。詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』CREATE SEQUENCEおよびALTER SEQUENCEを参照してください。順序を削除するには、DROP SEQUENCE文を使用します。『Oracle TimesTen In-Memory Database SQLリファレンス』DROP SEQUENCEを参照してください。

バッチ割当ての理解

バッチ値に何を設定するかは、次の考慮事項によって異なります。

  • 値を1に設定すると、存在する要素の数に関係なく、順序値は単調な順番で発行されます。ただし、値が1の場合は、かなりの通信のオーバーヘッドが発生し、パフォーマンスに悪影響を与えます。システムのパフォーマンスに直接影響するため、必要な場合以外は、値を1に設定しないでください。

  • 1より大きい値を設定すると、一意の順序値はすべての要素をまたいで厳密な順番で発行されません。接続が順序から複数の値を取得する場合、これらの値が切れ目なく連続する保証はありません。複数の接続が順序から値を取得する場合、取得される値の範囲にギャップが存在する可能性があります。

  • 要素間の過度の通信を回避するために、バッチを大きい値に設定することを検討する必要があります(アプリケーションが適切に機能するためにバッチ値を1に設定する必要がある場合を除く)。

  • バッチ境界内の一意の順序値は、MAXVALUEより大きくすることはできません。たとえば、順序が1ずつ増分し、バッチ値が3、最大値が5の場合、最初のバッチには1、2、3が含まれています。2番目のバッチには4および5のみが含まれています。

  • バッチ値は、キャッシュ値以上である必要があります。

  • バッチ値を指定しない場合、デフォルトは1000万です。各要素には、最初は、独自の1000万件の値があります。1000万の値を使い果たすと、要素はさらに1000万件を取得します。最小値と最大値および一意の値の数は、MINVALUEMAXVALUEおよびINCREMENT BYの値によって決定されます。

  • レプリカ・セットの各要素には、様々なバッチがあります。

バッチ割当ての例を次に示します。

3つの要素に対するバッチ割当ての説明

この例では、myseq順序を作成し、バッチ値を100とします。次に、要素1に接続されている接続から、SELECT...NEXTVAL問合せを発行します。この例では、要素2に接続されている接続および要素3に接続されている接続から、それぞれ2番目および3番目のSELECT...NEXTVAL問合せを発行します。この例は、各要素に対するバッチ割当ての割当てを示しています。この例の詳細は次のとおりです。

  • 要素1は1-100のバッチを受信します。

  • 要素2は101-200のバッチを受信します。

  • 要素3は201-300のバッチを受信します。

要素1に接続されている接続から(SELECT elementId# FROM dualで示されている)、バッチ値100を指定してmyseq順序を作成します。次に、SELECT...NEXTVAL問合せを発行します。値1が返されることを確認します。

Command> SELECT elementId# FROM dual;
< 1 >
1 row found.
Command> CREATE SEQUENCE myseq BATCH 100;
Command> SELECT myseq.NEXTVAL FROM dual;
< 1 >
1 row found.

要素2に接続されている接続から、最初に要素2への接続を確認し、次にSELECT...NEXTVAL問合せを発行します。値101が返されることを確認します。

Command> SELECT elementId# FROM dual;
< 2 >
1 row found.
Command> SELECT myseq.NEXTVAL FROM dual;
< 101 >
1 row found.

要素3に接続されている接続から、最初に要素3への接続を確認し、次にSELECT...NEXTVAL問合せを発行します。値201が返されることを確認します。

Command> SELECT elementId# FROM dual;
< 3 >
1 row found.
Command> SELECT myseq.NEXTVAL FROM dual;
< 201 >
1 row found.

3つの要素に対する2番目のバッチ割当ての説明

この例では、バッチ値が100のmyseq2順序を作成します。次に、要素1に接続されている接続から、SELECT...NEXTVAL問合せを発行します。この例では、要素3に接続されている接続および要素2に接続されている接続から、それぞれ2番目および3番目のSELECT...NEXTVAL問合せを発行します。この例は、各要素に対するバッチ割当ての割当てを示しています。この例の詳細は次のとおりです。

  • 要素1は1-100のバッチを受信します。

  • 要素3は101-200のバッチを受信します。

  • 要素2は201-300のバッチを受信します。

要素1に接続されている接続から(SELECT elementId# FROM dualで示されている)、バッチ値100を指定してmyseq2順序を作成します。次に、SELECT...NEXTVAL問合せを発行します。値1が返されることを確認します。

Command> SELECT elementId# FROM dual;
< 1 >
1 row found.
Command> CREATE SEQUENCE myseq2 BATCH 100;
Command> SELECT myseq2.NEXTVAL FROM dual;
< 1 >
1 row found.

要素3に接続されている接続から、最初に要素3への接続を確認し、次にSELECT...NEXTVAL問合せを発行します。値101が返されることを確認します。

Command> SELECT elementId# FROM dual;
< 3 >
1 row found.
Command> SELECT myseq2.NEXTVAL FROM dual;
< 101 >
1 row found.

要素2に接続されている接続から、最初に要素2への接続を確認し、次にSELECT...NEXTVAL問合せを発行します。値201が返されることを確認します。

Command> SELECT elementId# FROM dual;
< 2 >
1 row found.
Command> SELECT myseq2.NEXTVAL FROM dual;
< 201 >
1 row found.