SAP HANA チュートリアル: シーケンスの作成

⚡ スマートサマリー

シーケンスを作成する SAP HANAは、数値のリストを自動的に増分して生成するデータベースオブジェクトを定義します。パラメータによって、ジェネレータの開始値、増分、制限、サイクル、およびキャッシュ動作を制御します。

  • 🔢 コア定義: 数列は、仕様に定められた規則に従って、昇順または降順で数値を生成します。
  • 🔗 テーブルバインディングなし: シーケンスは、テーブルに紐づけられるのではなく、アプリケーションで使用される独立したオブジェクトです。
  • 📍 2つの価値観: CURRVALは現在の値を返します。NEXTVALはシーケンスを進めて新しい値を返します。
  • 🎚️ 主なパラメータ: START WITH、INCREMENT BY、MAXVALUE、MINVALUE、CYCLE、およびCACHEは出力の形状を決定します。
  • ♻️ サイクリング: CYCLEを指定すると、制限値に達した時点で番号付けが再開されます。NO CYCLEはデフォルト設定で、代わりにエラーが発生します。
  • キャッシング: CACHEは、速度向上のためにノードごとに数値のブロックを予約します。デフォルトではNO CACHEが有効になっています。
  • 🔄 リセット オプション: RESET BY は、データベースの再起動時にサブクエリを実行し、そのサブクエリが返す値から処理を再開します。

シーケンスを作成する SAP HANA

シークエンスとは?

シーケンスは、シーケンス仕様で指定されたルールに従って、数値の増分リストを自動的に生成するデータベース オブジェクトです。

たとえば、テーブルに新しいレコードが挿入されたときに、テーブルの列 (EMPLOYEE_NO) に従業員番号を自動的に挿入するには、シーケンスを使用します。

シーケンス値は昇順または降順で生成されます。

シーケンスはテーブルに関連付けられません。 これらはアプリケーションによって使用されます。 XNUMX つの値が連続しています –

  • CURRVAL – シーケンスの現在の値を提供します。
  • NEXTVAL – シーケンスの次の値を提供します。

構文

CREATE SEQUENCE <sequence_name> [<sequence_parameter_list>] [RESET BY <subquery>]

構文要素

要素 DESCRIPTION
シーケンスの名前です。
[ ] XNUMX つ以上のシーケンス パラメータを指定します。
皮切りに 開始シーケンス値を記述します。
インクリメントバイ これは、新しいシーケンス値が生成されるたびに割り当てられた最後の値から増加する値を指定します。 デフォルトは 1 です。
マックスバリュー これは、シーケンスによって生成可能な最大値を指定します。 -4611686018427387903から4611686018427387902までの範囲になります。
最大値なし NO MAXVALUEが指定されている場合、昇順シーケンスの最大値は4611686018427387903となり、降順シーケンスの最小値は-1となります。
最小値/ 最小値なし これは、シーケンスが生成できる最小値を指定します。 -4611686018427387904 から 4611686018427387902 の範囲になります。NO MINVALUE を使用する場合、昇順シーケンスの最小値は 1 です。
CYCLE CYCLEディレクティブは、シーケンス番号が最大値または最小値に達した後に、その番号がリセットされることを指定します。
サイクルなし デフォルトオプション。NO CYCLEディレクティブは、シーケンス番号が最大値または最小値に達した後、再開しないことを指定します。
キャッシュ キャッシュサイズは、ノードにキャッシュされるシーケンス番号の範囲を指定します。符号なし整数である必要があります。
キャッシュなし デフォルトオプション。NO CACHE ディレクティブを指定すると、シーケンス番号はノードにキャッシュされません。
リセット データベースの再起動中に、データベースが自動的にそしてシーケンス値は戻り値で再開されます。

例–

DHK_SCHEMA.EMP_NO という名前のシーケンスを作成します。これにより、シーケンスが使用されるたびに +1 ずつ増加するシーケンスの値が作成されます。

シーケンススクリプト –

CREATE SEQUENCE DHK_SCHEMA.EMP_NO START WITH 100 INCREMENT BY 1;

ここでは、以下の例のオブジェクト「sequence」を使用して、選択クエリが実行されるたびに従業員番号の値を +1 ずつインクリメントします。 クエリでは、「nextval」をシリアル番号の生成または同じ種類の要件に使用できます。

シーケンスの使用 –

SELECT DHK_SCHEMA.EMP_NO.nextval FROM DUMMY;

出力 – 上記の SELECT クエリを実行するたびに、100、101、102 … などとなります。

テーブル内でシーケンスを使用する方法

上記の例では数値を返しますが、どこにも保存しません。シーケンスを実際のデータに接続するパターンは3種類あり、適切なパターンはアプリケーションが必要とする制御レベルによって異なります。

1) INSERT文でNEXTVALを直接呼び出します。 最も明確なアプローチ。アプリケーションが数値が消費されるタイミングを決定する。

CREATE COLUMN TABLE DHK_SCHEMA.EMPLOYEE (
  EMPLOYEE_NO INTEGER NOT NULL,
  EMP_NAME    NVARCHAR(100),
  PRIMARY KEY (EMPLOYEE_NO)
);

INSERT INTO DHK_SCHEMA.EMPLOYEE
  VALUES (DHK_SCHEMA.EMP_NO.NEXTVAL, 'Anita Sharma');

2) シーケンスを列のデフォルト値として使用する。 挿入時に列が指定されていない場合でも番号が割り当てられるため、シーケンス番号を知ることを前提として開発されていないアプリケーションに適しています。

CREATE COLUMN TABLE DHK_SCHEMA.EMPLOYEE2 (
  EMPLOYEE_NO INTEGER DEFAULT DHK_SCHEMA.EMP_NO.NEXTVAL,
  EMP_NAME    NVARCHAR(100)
);

INSERT INTO DHK_SCHEMA.EMPLOYEE2 (EMP_NAME) VALUES ('Ravi Kumar');

3) 発行されたばかりの値を読み取ります。 CURRVAL 関数は、このセッションで最後に使用された番号を返します。この番号によって、子行が挿入されたばかりの親行にリンクされます。

SELECT DHK_SCHEMA.EMP_NO.CURRVAL FROM DUMMY;

⚠️ 警告: CURRVAL は、現在のセッションで NEXTVAL が少なくとも 1 回呼び出されるまでエラーで失敗します。CURRVAL は、グローバル最大値ではなく、このセッションに割り当てられた値を報告します。そのため、2 つのセッションが同時に異なる現在の値を保持することができます。

シーケンス対同一性列

SAP HANAには、別のオブジェクトを使わずに数値を生成するID列も用意されています。この2つは、同じ問題を異なる方法で解決しています。

シーケンス 識別列
オブジェクトタイプ 独立したデータベースオブジェクト 1 つのテーブルの列プロパティ
テーブル間で共有 はい、任意の数のテーブルがそこからデータを抽出できます。 いいえ、それは単一の列に属します
挿入前に表示される値 はい、NEXTVALを通じて いいえ、挿入中に生成されます
シーケンスを作成する デフォルトでIDとして生成されます
ベスト 番号の共有、親子挿入 1つのテーブル上のシンプルなサロゲートキー

行が存在する前に番号が分かっている必要がある場合、または複数のテーブルが同じ番号シリーズを共有する場合は、シーケンスを選択してください。より広範な要件がない単純なサロゲートキーの場合は、ID列を選択してください。

シーケンスの管理:ALTER、DROP、およびギャップ

シーケンスは最初に作成された状態のまま維持されることはほとんどありません。3つのメンテナンス作業が繰り返し発生します。

行動を変える。 ALTER SEQUENCE は、既存のシーケンスの増分、制限、またはサイクルをドロップなしで調整します。ping it. RESTART WITH はカウンターをリセットします。これはテストデータの再読み込み後の通常の手順です。

ALTER SEQUENCE DHK_SCHEMA.EMP_NO RESTART WITH 1000;
ALTER SEQUENCE DHK_SCHEMA.EMP_NO INCREMENT BY 10;
DROP SEQUENCE DHK_SCHEMA.EMP_NO;

ギャップを理解する。 シーケンス番号は連続しているとは限らないため、途切れることのない監査証跡を期待する人々は驚くかもしれません。ギャップが生じる理由は3つあります。

  • 取引をロールバックしました。 NEXTVALはトランザクションに対応していません。挿入処理によって消費された数値が後でロールバックされた場合、その数値は再発行されません。
  • キャッシング。 CACHE 100では、ノードは一度に100個の値を予約します。再起動時には、そのブロック内で未使用のまま残っている値はすべて破棄されます。
  • 同時開催セッション。 2つのセッションが同時に挿入を行う場合、それぞれの番号が交互に挿入されるため、どちらのセッションでも連続した番号は表示されません。

実務上の原則は、シーケンスを一意の識別子のソースとして扱い、行数をカウントするカウンターとして扱うべきではないということです。請求書番号のように、途切れない連続したシーケンスが法的要件となっている場合は、データベースのシーケンスではなく、独自の制御機能を備えたアプリケーションロジックによって生成する必要があります。

何が存在するのかを見つける。 システムビューSEQUENCESは、すべてのシーケンスとその現在の値を一覧表示します。これはスキーマを監査する最も迅速な方法です。関連する構文については、以下を参照してください。 SAP HANASQL について 列定義 SAP HANAデータ型.

よくあるご質問

ロールバックされたトランザクション、再起動時に失われるキャッシュされたブロック、および同時セッションはすべてギャップを生じさせます。シーケンスは一意性を保証しますが、連続した値の連続は保証しません。

はい。シーケンスはどのテーブルにも依存しないため、複数のテーブルがシーケンスからデータを取得できます。これは、識別子がテーブルごとではなく、スキーマ全体で一意である必要がある場合に便利です。

はい。挿入スループットを分析することで、ノードが再起動の間に消費する値の数を把握でき、キャッシュによる速度向上と、キャッシュによって生じるギャップの大きさとのバランスを取ることができます。

はい。現在の値を最大値および消費率と比較することで枯渇を予測できるため、本番環境で挿入が失敗し始める前にシーケンス幅を広げることができます。

現在のセッションではNEXTVALが呼び出されていないためです。CURRVALはこのセッションに発行された値を報告するため、値が取得されるまでは報告する情報がありません。