宣言済み一時表 とは、一時表を作成したアプリケーションによって発行された SQL ステートメントにのみアクセス可能な一時表を表します。宣言済み一時表は、アプリケーションがデータベースに接続している間しか有効ではありません。
宣言済み一時表を使用して、アプリケーションの潜在的パフォーマンスの向上を図ってください。宣言済み一時表を作成する場合には、 DB2 はシステム・カタログ表に項目を挿入しないため、サーバーでカタログの競合による問題が起きることはありません。通常の表の場合とは異なり、 DB2 は宣言済み一時表またはその行をロックせず、宣言済み一時表またはその表の内容をログしません。現行のアプリケーションで多量のデータを処理するために表を作成し、アプリケーションによるデータの操作が終了する際にそれらの表を除去する場合には、通常の表のかわりに宣言済み一時表を使用することを検討してください。
並行ユーザー用にアプリケーションを開発する場合には、宣言済み一時表が役立ちます。通常の表とは異なり、宣言済み一時表では名前が重複しても問題は起こりません。アプリケーションの各インスタンスでは、 DB2 は同じ名前の宣言済み一時表を作成することができます。たとえば、多量の一時データを処理するのに通常の表を使用する並行ユーザーのためにアプリケーションを作成する場合には、アプリケーションの各インスタンスが一時データを保持する通常の表に対して固有な名前を使用する必要があります。一般的には、ある時点で使用されている表の名前をたどる別の表を作成します。しかし、宣言済み一時表を使用すると、一時データに対して 1 つの宣言済み一時表を指定するだけで済みます。 DB2 は、アプリケーションの各インスタンスで固有な表が使用されていることを保証します。
宣言済み一時表を使用するには、次のようなステップを実行します。
ステップ 1. | USER TEMPORARY TABLESPACE が存在することを確認する。 USER TEMPORARY TABLESPACE が存在しない場合には、 CREATE USER TEMPORARY TABLESPACE ステートメントを発行します。 |
ステップ 2. | アプリケーションで DECLARE GLOBAL TEMPORARY TABLE ステートメントを発行する。
|
宣言済み一時表のスキーマは必ず SESSION になります。 SQL ステートメントで宣言済み一時表を使用するには、 SESSION スキーマ修飾子を使用して表を明示的に参照するか、 SESSION の DEFAULT スキーマを使用して修飾されていない参照を修飾してください。次の例では、以下のステートメントで TT1 という宣言済み一時表を作成すると、表の名前は必ず SESSION というスキーマ名で修飾されます。
DECLARE GLOBAL TEMPORARY TABLE TT1
前述の例で作成された宣言済み一時表から column1 列の内容を選択するには、次のようなステートメントを使用します。
SELECT column1 FROM SESSION.TT1;
DB2 では、SESSION スキーマを使用して持続する表も作成できることに注目してください。 SESSION.TT3 という修飾名で持続する表を作成すると、 SESSION.TT3 という修飾名の宣言済み一時表を作成できます。この場合、同一の修飾名を持つ持続表および宣言済み一時表への参照は、 DB2 によって宣言済み一時表に解決されます。持続表と宣言済み一時表の混同を避けるには、 SESSION スキーマを使用して持続表を作成しないでください。
SESSION スキーマで修飾された表、ビュー、または別名への静的 SQL 参照を含むアプリケーションを作成する場合、 DB2 事前コンパイラーはバインド実行時にはそのステートメントをコンパイルせずに、そのステートメントに対して「コンパイルが必要」なことを記します。そして、実行時に DB2 はそのステートメントをコンパイルします。この動作は、増分バインド として知られています。 DB2 は、SESSION スキーマによって修飾されている表、ビュー、および別名への静的 SQL 参照の増分バインドを自動的に実行します。これらのステートメントで増分バインドが使用可能になるように、 BIND または PRECOMPILE コマンドで VALIDATE RUN オプションを指定する必要はありません。
トランザクションに対して DECLARE GLOBAL TEMPORARY TABLE ステートメントを含む ROLLBACK ステートメントを出すと、 DB2 は宣言済み一時表を除去します。宣言済み一時表に DROP TABLE ステートメントを出すと、そのトランザクションに ROLLBACK ステートメントを出しても空の宣言済み一時表が復元されるだけです。 DROP TABLE ステートメントの ROLLBACK は、宣言済み一時表の行を復元しません。
宣言済み一時表の省略時の振る舞いでは、トランザクションがコミットされる際に表からすべての行が削除されます。しかし、1 つまたは複数の WITH HOLD カーソルが宣言済み一時表でまだオープンされている場合には、トランザクションをコミットしても DB2 は表から行を削除しません。トランザクションをコミットする際にすべての行が削除されないようにするには、 DECLARE GLOBAL TEMPORARY TABLE で ON COMMIT PRESERVE ROWS 文節を使用して一時表を作成してください。
トランザクション内で INSERT、UPDATE、または DELETE ステートメントを使用して宣言済み一時表の内容を変更した後に、そのトランザクションをロールバックした場合、 DB2 は宣言済み一時表のすべての行を削除します。 INSERT、UPDATE、または DELETE ステートメントを使用して宣言済み一時表の内容を変更しようして、そのステートメントが失敗すると、 DB2 は宣言済み一時表のすべての行を削除します。
区分化された環境では、ノードで障害が発生すると、その障害が発生したノードに区分が存在する宣言済み一時表は使用できなくなります。その後、これらの使用不能な宣言済み一時表にアクセスしようとすると、エラー (SQL1477N) が起きます。アプリケーションによって使用不能な宣言済み一時表が検出されると、アプリケーションはその表を除去するか、 DECLARE GLOBAL TEMPORARY TABLE ステートメントで WITH REPLACE 文節を指定して、その表を再作成することができます。
宣言済み一時表には、いくつかの制限があります。たとえば、宣言済み一時表では索引、別名、またはビューを定義することができません。 IMPORT および LOAD を使用して宣言済み一時表を移植することもできません。 DECLARE GLOBAL TEMPORARY TABLE ステートメントの完全な構文、および宣言済み一時表の制限についての完全なリストについては、 SQL 解説書 を参照してください。