シーケンス(Sequence)はOracleテナントのデータベースオブジェクトで、重複しない順序付きの値を生成できます。テーブルの主キーとして重複しない列が必要な場合に役立ちます。本記事では、シーケンスの基本特性およびOceanBaseデータベースとOracleデータベースのシーケンスの違いについて説明します。
説明
OceanBaseデータベースはV4.2.1バージョンからリモートシーケンスへのアクセス機能をサポートしています。詳細については、DBLinkを使用したリモートデータベースへのデータアクセスを参照してください。
基本特性
シーケンスは、CURRVAL と NEXTVAL という2つの疑似列を提供します。クエリを実行するたびに、現在のシーケンス値と次のシーケンス値が返されます。NEXTVAL を照会するたびに、CURRVAL の値が進みます。
シーケンスの定義では、シーケンス名、シーケンスのステップサイズ、昇順または降順などを指定できます。
CREATE SEQUENCE ステートメントはシーケンスを作成するために使用され、構文は以下のとおりです:
CREATE SEQUENCE sequence_name
[MINVALUE value | NOMINVALUE]
[MAXVALUE value | NOMAXVALUE]
[START WITH value]
[INCREMENT BY value]
[CACHE value | NOCACHE]
[ORDER | NOORDER]
[CYCLE | NOCYCLE];
説明
MINVALUEとMAXVALUEは、最小値と最大値を指定します。START WITHは開始値を指定します。INCREMENT BYはステップサイズを指定します。負の数も指定可能で、デフォルトは1です。CACHEはパフォーマンス向上のために一部のシーケンス値をキャッシュするために使用され、同時実行が多い場合に有効です。CYCLEはシーケンス値が繰り返し使用されるかどうかを指定します。繰り返し使用する場合は、最大値または最小値を指定する必要があります。
シーケンスの作成が成功すると、USER_SEQUENCES、ALL_SEQUENCES、DBA_SEQUENCES ビューを使用して、作成したシーケンスを確認できます。
ALTER SEQUENCE ステートメントはシーケンスの属性を変更するために使用されます。シーケンスの開始値は変更できませんが、最小値、最大値、ステップサイズ、繰り返し属性などの他の属性は変更できます。構文は以下のとおりです:
ALTER SEQUENCE sequence_name
[MINVALUE value | NOMINVALUE]
[MAXVALUE value | NOMAXVALUE]
[INCREMENT BY value]
[CACHE value | NOCACHE]
[ORDER | NOORDER]
[CYCLE | NOCYCLE];
DROP SEQUENCE ステートメントはシーケンスを削除するために使用され、構文は以下のとおりです:
DROP SEQUENCE sequence_name;
シーケンスは独立したオブジェクトであり、同一のシーケンスを異なるテーブルで使用できます。以下の例では、最初の INSERT ステートメントはテーブル t1 に1を挿入し、2番目の INSERT ステートメントはテーブル t2 に2を挿入します。
CREATE SEQUENCE s1 MINVALUE 1 MAXVALUE 100 INCREMENT BY 1;
INSERT INTO t1 (id) VALUES (s1.nextval);
INSERT INTO t2 (id) VALUES (s1.nextval);
注意事項
CACHEとORDERについて
CACHE と ORDER に関するOceanBaseデータベースとOracleデータベースのシーケンスの違いは、次の表のとおりです。
モード |
Oracleデータベース |
OceanBaseデータベース |
|---|---|---|
| NOCACHE with ORDER | すべてのインスタンスはいかなるシーケンスもキャッシュせず、使用時にグローバル CACHE から取得します。CACHE はリクエストの先着順でシーケンス値を返します。 |
すべてのインスタンスはいかなるシーケンスもキャッシュせず、使用時にグローバル CACHE から取得します。CACHE はリクエストの先着順でシーケンス値を返します。 |
| NOCACHE with NOORDER | すべてのインスタンスはいかなるシーケンスもキャッシュせず、使用時にグローバル CACHE から取得します。CACHE は負荷状況に応じて一部のリクエストの処理を遅延させることがあり、これが NOORDER の原因となります。 |
構文のみ互換性があり、実際の動作は NOCACHE with ORDER と同じです。 |
| CACHE with ORDER | 各インスタンスは同一のシーケンスをキャッシュし、使用前にグローバルロックを取得してシーケンス内の次に利用可能な位置を同期する必要があります。 | 各インスタンスは同一のシーケンスをキャッシュし、使用前にグローバルロックを取得してシーケンス内の次に利用可能な位置を同期する必要があります。 |
| CACHE with NOORDER | 各インスタンスは異なるシーケンスをキャッシュし、グローバルな CACHE 状態の同期は不要です。この場合、値は自然と NOORDER となります。 |
各インスタンスは異なるシーケンスをキャッシュし、グローバルな CACHE 状態の同期は不要です。この場合、値は自然と NOORDER となります。 |
説明
- パフォーマンス上の理由から、OceanBaseデータベースではデフォルトの
CACHE with NOORDER方式の使用を推奨します。 - OceanBaseデータベースでは、
ORDER with NO CACHEの使用は推奨されません。このモードでは、NEXTVALを呼び出すたびに内部テーブルでSELECTとUPDATEの操作がトリガーされるため、データベースのパフォーマンスに影響します。 - シーケンス作成時、デフォルトの
CACHE値は20しかないため、手動でより大きな値を設定する必要があります。単一マシンでTPSが100の場合、CACHE SIZEは360000に設定することを推奨します。
CURRVALについて
あるノードで NEXTVAL によって取得したシーケンス値は、別のノードで CURRVAL によって取得することはできません。これは、Proxyが NEXTVAL を取得するステートメントと CURRVAL を取得するステートメントを異なるノードに送信した場合によく発生します。この状況を避けるためには、NEXTVAL の取得と CURRVAL の取得を同一トランザクション内で行い、Proxyが常に同じノードにクエリを送信するようにすることができます。