シーケンス(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が常に同じノードにQueryを送信するようにすることができます。