一時テーブル

一時テーブル機能は TiDB v5.3.0 で導入されました。この機能は、アプリケーションの中間結果を一時的に保存する問題を解決し、頻繁にテーブルを作成したり削除したりする必要がなくなります。中間計算データを一時テーブルに保存できます。中間データが不要になると、TiDB は一時テーブルを自動的にクリーンアップしてリサイクルします。これにより、ユーザー アプリケーションが複雑になりすぎることが回避され、テーブル管理のオーバーヘッドが軽減され、パフォーマンスが向上します。

このドキュメントでは、ユーザー シナリオと一時テーブルの種類を紹介し、使用例と一時テーブルのメモリ使用量を制限する方法について説明し、他の TiDB 機能との互換性制限について説明します。

ユーザーシナリオ

TiDB 一時テーブルは次のシナリオで使用できます。

  • アプリケーションの中間一時データをキャッシュします。計算が完了すると、データは通常のテーブルにダンプされ、一時テーブルは自動的に解放されます。
  • 同じデータに対して短時間に複数の DML 操作を実行します。たとえば、電子商取引ショッピング カート アプリケーションでは、製品の追加、変更、削除、支払いの完了、ショッピング カート情報の削除を行います。
  • 中間一時データをバッチで迅速にインポートし、一時データのインポートのパフォーマンスを向上させます。
  • データをバッチで更新します。データベース内の一時テーブルにデータをバッチでインポートし、データの変更が完了したら、データをファイルにエクスポートします。

一時テーブルの種類

TiDB の一時テーブルは、ローカル一時テーブルとグローバル一時テーブルの 2 つのタイプに分類されます。

  • ローカル一時テーブルの場合、テーブル定義とテーブル内のデータは現在のセッションでのみ表示されます。このタイプは、セッション内の中間データを一時的に保存するのに適しています。
  • グローバル一時テーブルの場合、テーブル定義は TiDB クラスター全体に表示され、テーブル内のデータは現在のトランザクションにのみ表示されます。トランザクション内の中間データを一時的に保存するのに適した型です。

ローカル一時テーブル

TiDB のローカル一時テーブルのセマンティクスは、MySQL 一時テーブルのセマンティクスと一致しています。特徴は次のとおりです。

  • ローカル一時テーブルのテーブル定義は永続的ではありません。ローカル一時テーブルは、テーブルが作成されたセッションにのみ表示され、他のセッションはテーブルにアクセスできません。
  • 異なるセッションに同じ名前のローカル一時テーブルを作成できます。各セッションは、セッション内で作成されたローカル一時テーブルに対して読み取り専用と書き込み専用を行います。
  • ローカル一時テーブルのデータは、セッション内のすべてのトランザクションに表示されます。
  • セッションが終了すると、セッションで作成されたローカル一時テーブルは自動的に削除されます。
  • ローカル一時テーブルには、通常のテーブルと同じ名前を付けることができます。この場合、DDL および DML ステートメントでは、ローカル一時テーブルが削除されるまで、通常のテーブルは非表示になります。

ローカル一時テーブルを作成するには、 CREATE TEMPORARY TABLEステートメントを使用できます。ローカル一時テーブルを削除するには、 DROP TABLEまたはDROP TEMPORARY TABLEステートメントを使用できます。

MySQL とは異なり、TiDB のローカル一時テーブルはすべて外部テーブルであり、SQL ステートメントの実行時に内部一時テーブルが自動的に作成されることはありません。

ローカル一時テーブルの使用例

ノート:

  • TiDB で一時テーブルを使用する前に、 他の TiDB 機能との互換性制限MySQL 一時テーブルとの互換性に注意してください。
  • TiDB v5.3.0 より前のクラスター上にローカル一時テーブルを作成した場合、これらのテーブルは実際には通常のテーブルであり、クラスターが TiDB v5.3.0 以降のバージョンにアップグレードされた後は通常のテーブルとして扱われます。

通常のテーブルusersがあると仮定します。

CREATE TABLE users ( id BIGINT, name VARCHAR(100), PRIMARY KEY(id) );

セッション A では、ローカル一時テーブルusersの作成は通常のテーブルusersと競合しません。セッション A がテーブルusersにアクセスすると、ローカル一時テーブルusersにアクセスします。

CREATE TEMPORARY TABLE users ( id BIGINT, name VARCHAR(100), city VARCHAR(50), PRIMARY KEY(id) );
Query OK, 0 rows affected (0.01 sec)

usersにデータを挿入すると、データはセッション A のローカル一時テーブルusersに挿入されます。

INSERT INTO users(id, name, city) VALUES(1001, 'Davis', 'LosAngeles');
Query OK, 1 row affected (0.00 sec)
SELECT * FROM users;
+------+-------+------------+ | id | name | city | +------+-------+------------+ | 1001 | Davis | LosAngeles | +------+-------+------------+ 1 row in set (0.00 sec)

セッション B では、ローカル一時テーブルusersを作成しても、セッション A の通常のテーブルusersやローカル一時テーブルusersと競合しません。セッション B がテーブルusersにアクセスする場合、セッション B のローカル一時テーブルusersにアクセスします。

CREATE TEMPORARY TABLE users ( id BIGINT, name VARCHAR(100), city VARCHAR(50), PRIMARY KEY(id) );
Query OK, 0 rows affected (0.01 sec)

usersにデータを挿入すると、データはセッション B のローカル一時テーブルusersに挿入されます。

INSERT INTO users(id, name, city) VALUES(1001, 'James', 'NewYork');
Query OK, 1 row affected (0.00 sec)
SELECT * FROM users;
+------+-------+---------+ | id | name | city | +------+-------+---------+ | 1001 | James | NewYork | +------+-------+---------+ 1 row in set (0.00 sec)

MySQL 一時テーブルとの互換性

TiDB ローカル一時テーブルの次の機能と制限は、MySQL 一時テーブルの機能と制限と同じです。

  • ローカル一時テーブルを作成または削除する場合、現在のトランザクションは自動的にコミットされません。
  • ローカル一時テーブルが配置されているスキーマを削除した後、一時テーブルは削除されず、引き続き読み取りおよび書き込み可能です。
  • ローカル一時テーブルを作成するには、 CREATE TEMPORARY TABLES権限が必要です。テーブルに対する後続のすべての操作には権限は必要ありません。
  • ローカル一時テーブルは、外部キーとパーティション テーブルをサポートしません。
  • ローカル一時テーブルに基づくビューの作成はサポートされていません。
  • SHOW [FULL] TABLESはローカル一時テーブルを表示しません。

TiDB のローカル一時テーブルは、次の点で MySQL 一時テーブルと互換性がありません。

  • TiDB ローカル一時テーブルはALTER TABLEをサポートしません。
  • TiDB ローカル一時テーブルはENGINEテーブル オプションを無視し、常に一時テーブル データを TiDBメモリにメモリ制限で保存します。
  • storageエンジンとしてMEMORYが宣言されている場合、TiDB ローカル一時テーブルはMEMORYstorageエンジンによって制限されません。
  • INNODBまたはMYISAMがstorageエンジンとして宣言されている場合、TiDB ローカル一時テーブルは InnoDB 一時テーブルに固有のシステム変数を無視します。
  • MySQL では、同じ SQL ステートメント内で同じ一時テーブルを複数回参照することは許可されません。 TiDB ローカル一時テーブルにはこの制限はありません。
  • MySQL の一時テーブルを示すシステム テーブルinformation_schema.INNODB_TEMP_TABLE_INFOは TiDB には存在しません。現在、TiDB にはローカル一時テーブルを表示するシステム テーブルがありません。
  • TiDB には内部一時テーブルがありません。内部一時テーブルの MySQL システム変数は TiDB に対しては有効ではありません。

グローバル一時テーブル

グローバル一時テーブルは TiDB の拡張機能です。特徴は次のとおりです。

  • グローバル一時テーブルのテーブル定義は永続的であり、すべてのセッションから参照できます。
  • グローバル一時テーブルのデータは、現在のトランザクションでのみ表示されます。トランザクションが終了すると、データは自動的に消去されます。
  • グローバル一時テーブルに通常のテーブルと同じ名前を付けることはできません。

グローバル一時テーブルを作成するには、 ON COMMIT DELETE ROWSで終わるCREATE GLOBAL TEMPORARY TABLEステートメントを使用できます。グローバル一時テーブルを削除するには、 DROP TABLEまたはDROP GLOBAL TEMPORARY TABLEステートメントを使用できます。

グローバル一時テーブルの使用例

ノート:

  • TiDB で一時テーブルを使用する前に、 他の TiDB 機能との互換性制限点に注意してください。
  • v5.3.0 以降の TiDB クラスター上にグローバル一時テーブルを作成した場合、クラスターが v5.3.0 より前のバージョンにダウングレードされると、これらのテーブルは通常のテーブルとして処理されます。この場合、データエラーが発生します。

セッション A にグローバル一時テーブルusersを作成します。

CREATE GLOBAL TEMPORARY TABLE users ( id BIGINT, name VARCHAR(100), city VARCHAR(50), PRIMARY KEY(id) ) ON COMMIT DELETE ROWS;
Query OK, 0 rows affected (0.01 sec)

usersに書き込まれたデータは、現在のトランザクションから参照できます。

BEGIN;
Query OK, 0 rows affected (0.00 sec)
INSERT INTO users(id, name, city) VALUES(1001, 'Davis', 'LosAngeles');
Query OK, 1 row affected (0.00 sec)
SELECT * FROM users;
+------+-------+------------+ | id | name | city | +------+-------+------------+ | 1001 | Davis | LosAngeles | +------+-------+------------+ 1 row in set (0.00 sec)

トランザクションが終了すると、データは自動的に消去されます。

COMMIT;
Query OK, 0 rows affected (0.00 sec)
SELECT * FROM users;
Empty set (0.00 sec)

セッション A でusersが作成されると、セッション B もテーブルusersの読み取りと書き込みを行うことができます。

SELECT * FROM users;
Empty set (0.00 sec)

ノート:

トランザクションが自動的にコミットされる場合、SQL ステートメントの実行後、挿入されたデータは自動的にクリアされ、後続の SQL 実行では使用できなくなります。したがって、グローバル一時テーブルの読み取りおよび書き込みには、非自動コミット トランザクションを使用する必要があります。

一時テーブルのメモリ使用量を制限する

テーブルを定義するときにどのstorageエンジンがENGINEとして宣言されていても、ローカル一時テーブルとグローバル一時テーブルのデータは TiDB インスタンスのメモリにのみ保存されます。このデータは永続化されません。

メモリのオーバーフローを避けるために、 tidb_tmp_table_max_sizeシステム変数を使用して各一時テーブルのサイズを制限できます。一時テーブルがtidb_tmp_table_max_sizeしきい値を超えると、TiDB はエラーを報告します。デフォルト値のtidb_tmp_table_max_size64MBです。

たとえば、一時テーブルの最大サイズを256MBに設定します。

SET GLOBAL tidb_tmp_table_max_size=268435456;

他の TiDB 機能との互換性制限

TiDB のローカル一時テーブルおよびグローバル一時テーブルは、次の TiDB 機能と互換性がありません

  • AUTO_RANDOM
  • SHARD_ROW_ID_BITSPRE_SPLIT_REGIONSテーブル オプション
  • パーティション化されたテーブル
  • SPLIT REGION件のステートメント
  • ADMIN CHECK TABLEおよびADMIN CHECKSUM TABLEステートメント
  • FLASHBACK TABLEおよびRECOVER TABLEステートメント
  • 一時テーブルに基づいてCREATE TABLE LIKEステートメントを実行する
  • ステイル読み取り
  • 外部キー
  • SQLバインディング
  • TiFlashレプリカ
  • 一時テーブルでのビューの作成
  • 配置ルール
  • 一時テーブルを含む実行プランはprepare plan cacheによってキャッシュされません。

TiDB のローカル一時テーブルは次の機能をサポートしていません

  • tidb_snapshotシステム変数を使用して履歴データを読み取ります。

TiDB 移行ツールのサポート

ローカル一時テーブルは現在のセッションでのみ表示されるため、TiDB 移行ツールによってエクスポート、バックアップ、複製されません。

グローバル一時テーブルは、テーブル定義がグローバルに表示されるため、TiDB 移行ツールによってエクスポート、バックアップ、複製されます。テーブル上のデータはエクスポートされないことに注意してください。

ノート:

  • TiCDC を使用して一時テーブルをレプリケートするには、TiCDC v5.3.0 以降が必要です。それ以外の場合、下流表の表定義が間違っています。
  • BRを使用して一時テーブルをバックアップするには、 BR v5.3.0 以降が必要です。そうしないと、バックアップされた一時テーブルのテーブル定義が間違っています。
  • エクスポートするクラスター、データ復元後のクラスター、およびレプリケーションのダウンストリーム クラスターは、グローバル一時テーブルをサポートする必要があります。それ以外の場合は、エラーが報告されます。

こちらも参照

このページは役に立ちましたか?