リリース情報


35.2 第 6 章 一般的な DB2 アプリケーション技法

35.2.1 順次値の生成

順次値を生成することは、一般的なデータベース・アプリケーション開発の問題です。 この問題を解決する最善の方法は、SQL でシーケンス・オブジェクトとシーケンス式を 使用することです。 各シーケンス・オブジェクト は、 固有の名前が付けられたデータベース・オブジェクトであり、 シーケンス式によってのみアクセスできます。 シーケンス式 には、 PREVVAL 式と NEXTVAL 式の 2 つがあります。 PREVVAL 式は、前のステートメントに対して指定されたシーケンスについて 最後に生成された値を返します。 NEXTVAL シーケンス式は、シーケンス・オブジェクトの値を増やして、 そのシーケンス・オブジェクトの新しい値を返します。

シーケンス・オブジェクトを作成するには、CREATE SEQUENCE ステートメントを実行します。 たとえば、デフォルトの属性を使用して id_values というシーケンス・オブジェクトを 作成するには、次のステートメントを実行します。

CREATE SEQUENCE id_values

シーケンス・オブジェクトの現行値を表示するには、 PREVVAL 式を使用して VALUES ステートメントを実行します。

VALUES PREVVAL FOR id_values
 
1-----------
1
            1 レコードが選択されました。

シーケンス・オブジェクトの現行値は繰り返し検索することができます。 シーケンス・オブジェクトが返す値は、NEXTVAL 式を実行するまで変わりません。 以下の例では、NEXTVAL 式がシーケンス・オブジェクトの値を増やすまで、 PREVVAL は値 1 を返します。

VALUES PREVVAL FOR id_values
 
1-----------
1
            1 レコードが選択されました。
 
VALUES PREVVAL FOR id_values
 
1-----------
1
            1 レコードが選択されました。
 
VALUES NEXTVAL FOR id_values
 
1-----------
          2
 
            1 レコードが選択されました。
 
VALUES PREVVAL FOR id_values
 
1-----------
          2
 
            1 レコードが選択されました。

シーケンス・オブジェクトの 次の値で列の値を更新するには、次のように UPDATE ステートメントに NEXTVAL 式を組み込みます。

UPDATE staff
  SET id = NEXTVAL FOR id_values
  WHERE id = 350

シーケンス・オブジェクトの次の値を使用して 新しい行を表に挿入するには、次のように INSERT ステートメントに NEXTVAL 式を組み込みます。

INSERT INTO staff (id, name, dept, job)
  VALUES (NEXTVAL FOR id_values, 'Kandil', 51, 'Mgr')

PREVVAL 式と NEXTVAL 式について詳しくは、「SQL 解説書」を参照してください。

35.2.1.1 シーケンスの振る舞いの制御

アプリケーションの要求を満たすようにシーケンス・オブジェクトの振る舞いを 調整することができます。 CREATE SEQUENCE ステートメントを実行して新しいシーケンス・オブジェクトを作成する場合、 および既存のシーケンス・オブジェクトに対して ALTER SEQUENCE を実行する場合は、 シーケンス・オブジェクトの属性を変更します。 指定可能なシーケンス・オブジェクトの属性のいくつかを以下に示します。

データ・タイプ
CREATE SEQUENCE ステートメントの AS 文節は、シーケンス・オブジェクトの 数値データ・タイプを指定します。 「SQL 解説書」の付録「SQL 制限」に示されているように、 このデータ・タイプはシーケンス・オブジェクトの使用可能な最小値と最大値を決定します。 シーケンス・オブジェクトのデータ・タイプを変更することはできません。 代わりに、DROP SEQUENCE ステートメントを実行してから 新しいデータ・タイプで CREATE SEQUENCE ステートメントを実行することにより シーケンス・オブジェクトをドロップする必要があります。

開始値
CREATE SEQUENCE ステートメントの START WITH 文節は、シーケンス・オブジェクトの 初期値を設定します。 ALTER SEQUENCE ステートメントの RESTART WITH 文節は、シーケンス・オブジェクトの値を指定値にリセットします。

最小値
MINVALUE 文節は、シーケンス・オブジェクトの最小値を設定します。

最大値
MAXVALUE 文節は、シーケンス・オブジェクトの最大値を設定します。

増分値
INCREMENT BY 文節は、各 NEXTVAL 式がシーケンス・オブジェクトに追加する値を設定します。 シーケンス・オブジェクトの値を減らすには、負の値を指定します。

シーケンス循環
CYCLE 文節は、シーケンス・オブジェクトの値が最小値または最大値に達したとき、 次の NEXTVAL 式でその値を初期値に戻します。

たとえば、開始値が 0、最大値が 1000、各 NEXTVAL 式での増分値が 2 で、 最大値に達したときに開始値に戻る id_values というシーケンス・オブジェクトを 作成するには、次のステートメントを実行します。

CREATE SEQUENCE id_values
  START WITH 0
  INCREMENT BY 2
  MAXVALUE 1000
  CYCLE

CREATE SEQUENCE ステートメントと ALTER SEQUENCE ステートメントについて詳しくは、 「SQL 解説書」を参照してください。

35.2.1.2 シーケンス・オブジェクトによるパフォーマンスの向上

識別列のように、シーケンス・オブジェクトを使用して値を生成する場合、 一般に、他の方法と比べてアプリケーションのパフォーマンスが向上します。 シーケンス・オブジェクトを制御する別の方法として、現行値を保管する単一列表を 作成し、トリガーを使用して、またはアプリケーションの制御下で、 その値を増やす方法があります。 単一列表にアプリケーションが並行してアクセスする分散環境では、 順番に表にアクセスすることを強制するために必要になるロックが、 パフォーマンスに大きく影響します。

シーケンス・オブジェクトは、単一列表を使用する方法に関連するロック発行を行わずに、 シーケンス値をメモリーにキャッシュして DB2 の応答時間を改善することができます。 シーケンス・オブジェクトを使用するアプリケーションのパフォーマンスを最大にするには、 シーケンス・オブジェクトが適切な量のシーケンス値を確実にキャッシュするようにします。 CREATE SEQUENCE ステートメントおよび ALTER SEQUENCE ステートメントの CACHE 文節は、 DB2 が生成してメモリーに保管するシーケンス値の最大数を指定します。

シーケンス・オブジェクトが順序正しく値を生成する必要があり、 システム障害またはデータベース非活動化でその順序が途切れないようにする場合、 ORDER および NO CACHE 文節を CREATE SEQUENCE ステートメントで使用します。 NO CACHE 文節は、生成された値が途切れないことを保証します。 この場合、シーケンス・オブジェクトが新しい値を生成するたびに データベース・ログに書き込むため、アプリケーションのパフォーマンスが低下します。

35.2.1.3 シーケンス・オブジェクトと識別列の比較

シーケンス・オブジェクトと識別列は DB2 アプリケーションに対して 同じような目的を果たすために使用されているように見えますが、 いくつかの重要な違いがあります。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]