一時テーブルは、トランザクションまたはセッションの期間中にのみ存在するデータを格納します。本記事では、主にOceanBaseデータベースのグローバル一時テーブル(GTT)とその作成方法について説明します。
グローバル一時テーブルの概要
グローバル一時テーブルは、一定期間のデータを保存するために使用されます。ここでの一定期間は、トランザクションのライフサイクルまたはセッションのライフサイクルになります。
グローバル一時テーブルの列定義はすべてのセッションから可視化できます。しかし、グローバル一時テーブル内のデータはセッション固有のものであり、現在のセッションは自身のデータのみを見て変更できます。
例えば、学生の授業選択シナリオでは、一時テーブルを使用して選択した授業内容を一時的に保存します。セッション期間中、選択授業データは非公開です。学生が選択授業リストを確認すると、アプリケーションは一時テーブルから通常テーブルへ選択情報を移動します。セッション終了時、データベースは自動的にグローバル一時テーブル内のデータを削除します。
グローバル一時テーブルの作成方法
ユーザーは CREATE GLOBAL TEMPORARY TABLE ステートメントを使用してグローバル一時テーブルを作成できます。ON COMMIT 句を使用して、トランザクション一時テーブルかセッション一時テーブルかを制御します。具体的には以下のとおりです:
ON COMMIT DELETE ROWS:トランザクションレベルの一時テーブル。コミット時にデータを削除します。ON COMMIT PRESERVE ROWS:セッションレベルの一時テーブル。セッション終了時にデータを削除します。
グローバル一時テーブルにはインデックスを作成できますが、グローバル一時テーブルのインデックステーブルのデータも一時的なものであり、データはセッション固有のものです。
一時外部テーブル
一時外部テーブルは、クエリ実行中に一時的に作成される外部テーブルであり、データの読み取りに使用されます。クエリ終了後、このテーブルは自動的に削除されます。
OceanBaseデータベースは、SELECT URL および LOAD DATA ステートメントを使用して外部テーブルデータを読み取るかインポートする機能をサポートしています。
例
例1:トランザクションレベルの一時テーブルを作成する
トランザクションレベルの一時テーブル
tbl1を作成します。obclient [SYS]> CREATE GLOBAL TEMPORARY TABLE tbl1(col1 INT) ON COMMIT DELETE ROWS;一時テーブル
tbl1に1件のデータを挿入します。obclient [SYS]> INSERT INTO tbl1 VALUES(1);一時テーブル
tbl1のデータをクエリします。obclient [SYS]> SELECT * FROM tbl1;実行結果は次のとおりです:
+------+ | COL1 | +------+ | 1 | +------+ 1 row in setトランザクションをコミットします。
obclient [SYS]> COMMIT;一時テーブル
tbl1のデータを再度クエリします。obclient [SYS]> SELECT * FROM tbl1;実行結果は次のとおりです:
Empty set
例2:セッションレベルの一時テーブルを作成する
セッション1で以下の操作を実行します:
セッションレベルの一時テーブル
tbl2を作成します。obclient [SYS]> CREATE GLOBAL TEMPORARY TABLE tbl2(col1 INT) ON COMMIT PRESERVE ROWS;一時テーブル
tbl2に1件のデータを挿入します。obclient [SYS]> INSERT INTO tbl2 VALUES(1);一時テーブル
tbl2のデータをクエリします。obclient [SYS]> SELECT * FROM tbl2;実行結果は次のとおりです:
+------+ | COL1 | +------+ | 1 | +------+ 1 row in setトランザクションをコミットします。
obclient [SYS]> COMMIT;一時テーブル
tbl2のデータを再度クエリします。obclient [SYS]> SELECT * FROM tbl2;実行結果は次のとおりです:
+------+ | COL1 | +------+ | 1 | +------+ 1 row in set
セッション2で、またはセッション1を終了してデータベースに再接続した後、以下の操作を実行します:
一時テーブル tbl2 のデータを照会します。
obclient [SYS]> SELECT * FROM tbl2;
実行結果は次のとおりです:
Empty set