この記事は、Huawei クラウド コミュニティ「GaussDB (DWS) 一時テーブル シリーズ - ローカル一時テーブル」 (作成者: acydy) から共有されたものです。
GaussDB (DWS) は、バージョン 8.2.1 以降、ローカル一時テーブル、揮発性一時テーブル、およびグローバル一時テーブルの 3 つの形式の一時テーブルをサポートしています。この記事ではまずDWSのローカルテンポラリテーブル機能について紹介します。
ローカル一時テーブルの機能: テーブル定義とデータはセッションに関連しており、他のセッションはこのセッションによって作成されたローカル一時テーブルを参照できません。メタデータはシステム テーブルに保存され、クラスター ノードに異常な障害が発生した場合はRETRYがサポートされます。
文法と用法
作成 [ローカル] { 一時 | TEMP } TABLE [ IF NOT EXISTS ] テーブル名 ({ 列名 データ型 [ 圧縮モード ] [ COLLATE 照合順序 ] [ 列制約 [ ... ] ] | テーブル制約 | LIKE ソーステーブル [ like_option [...] ] } [, ... ]) [ WITH ( {storage_parameter = value} [, ... ] ) ] [ ON COMMIT { PRESERVE ROWS | WITH ( {storage_parameter = value} [, ... ] ) ] [ 行を削除 } ]
テーブルを作成するときは、TEMP または TEMPORARY を指定する必要があります。これは、ローカル一時テーブルを作成することを意味します。
- ON COMMIT { 行を保持 | 行を削除 }
ON COMMIT オプションは、トランザクションで一時テーブルを作成するかどうかを決定します。トランザクションがコミットされると、この一時テーブルの後続の操作が実行されます。
- PRESERVE ROWS (デフォルト値): 送信時に一時テーブルに対して操作は実行されず、一時テーブルとそのテーブル データは変更されません。このタイプがおすすめです。
- DELETE ROWS: 送信時に一時テーブル内のデータを削除します。
その他の部分は通常のテーブルと同じです。
gaussdb=# 一時テーブルを作成します tmp1(a int,b int); 注意: 「DISTRIBUTE BY」句は指定されていません。デフォルトでは分散モードとしてラウンドロビンを使用します。 ヒント: 適切なデータ分散列を指定するには、「DISTRIBUTE BY」句を使用してください。 テーブルの作成
一時テーブルには、一時テーブル以外のテーブルと同じ名前を付けることができます。同じ名前の場合、一時テーブルの優先順位は一時テーブル以外のテーブルの優先順位よりも高くなります。
gaussdb=# 一時テーブルを作成します tmp1(a int,b int); 注意: 「DISTRIBUTE BY」句は指定されていません。デフォルトでは分散モードとしてラウンドロビンを使用します。 ヒント: 適切なデータ分散列を指定するには、「DISTRIBUTE BY」句を使用してください。 CREATE TABLE gaussdb=# tmp1 に挿入 value(1,1); INSERT 0 1 gaussdb=# テーブル tmp1 を作成します(a int,b int); 注意: 「DISTRIBUTE BY」句は指定されていません。デフォルトでは分散モードとしてラウンドロビンを使用します。 ヒント: 適切なデータ分散列を指定するには、「DISTRIBUTE BY」句を使用してください。 CREATE TABLE gaussdb=# select *from tmp1; | b ---+--- 1 | 1 (1 行) gaussdb=# select *from public.tmp1; | b ---+--- (0 行)
ビュー: 一時テーブルに基づいて作成されたビューは一時ビューです。
postgres=# select *from tmp1 としてビュー tmp_v1 を作成します。 注意: ビュー「tmp_v1」は一時ビューになります CREATE VIEW
使用するシーン
-
複雑なビジネス ロジックはローカル一時テーブルを使用して分割されます
ビジネス SQL ステートメントが複雑すぎる場合は、ローカル一時テーブルを使用して実行の中間結果をキャッシュし、複雑なビジネス ロジックを複数の単純なステートメントに分割できます。単純な明細の統計情報がより準備され、分割されたビジネスの維持が容易になります。
-
CN ノードの例外をサポートします。
GaussDB (DWS) は、分散アーキテクチャ データベースです。コーディネーター (CN) は複数存在し、関係は対等です。クライアントは任意の CN に接続できます。CN にはテーブルのメタデータ情報が格納されます。DDL を実行すると、データの一貫性を確保するためにメタデータがすべての DN で同期されます。CNに異常が発生すると、テーブルの作成や削除などの操作が失敗し、ジョブ全体が失敗します。このシナリオでは、ローカル一時テーブルを使用できます。ローカル一時テーブルは、現在のセッションでのみ表示されます。ローカル一時テーブルの作成、ALTER、削除などの操作を実行すると、現在の CN でメタデータのみが変更されます。他のCNノードの異常の影響を受けず、業務継続を確保します。
原理
一時テーブルと通常のテーブルのメタデータの違いは、一時テーブルは他のセッションでは表示されないため、現在のセッションにのみ属するスキーマ内に構築されることです。このセッションが初めて一時テーブルを作成するとき、セッションのスキーマも同時に作成されます。一時スキーマはセッションごとに異なります。
セッション 1:
gaussdb=# 一時テーブルを作成します tmp1(a int,b int); 注意: 「DISTRIBUTE BY」句は指定されていません。デフォルトでは分散モードとしてラウンドロビンを使用します。 ヒント: 適切なデータ分散列を指定するには、「DISTRIBUTE BY」句を使用してください。 CREATE TABLE gaussdb=# \d+ tmp1 テーブル "pg_temp_coordinator1_65_3_140257888512760.tmp1" 列 | タイプ | 修飾子 | ストレージ | 統計目標 | 説明 --------+-----------+-----------+-----------+-------- -------+--------------- a | 整数 | | プレーン | | b | 整数 | | プレーン | | OID あり: なし 配布者: ROUND ROBIN ロケーション ノード: ALL DATANODES オプション: Orientation=row、compression=no:
セッション 2、tmp1 テーブルはクエリできません。
gaussdb=# tmp1 から * を選択; エラー: リレーション "tmp1" が存在しません 行 1: select * from tmp1; ^
一時スキーマの命名規則: pg_temp_Coordinator name_timelineID_global auto-increment ID_threadID
コーディネータ名: CN 名。異なる CN によって作成されたスキーマを分離します。
timelineID: ノードの再起動後に増加し、このスキーマが無効かどうかを判断するために使用されます。
グローバル自動インクリメント ID: 単一の CN 上の自動インクリメント ID。同じ CN が異なるセッション自動インクリメント ID を持つ必要はありません。
メタデータ: ローカル一時テーブルの relpersistence フラグは「t」です。
gaussdb=# select relname, relpersistence from pg_class where relname = 'tmp1'; リリース名 | relpersistence --------+---------------- tmp1 | t
データクリーニング:
-
セッションが正常に終了します セッションが正常に
終了すると、ローカル一時テーブルのテーブル定義とデータが削除されます。元のデータにはアクセスできなくなります。 -
セッションが異常終了した場合、または現在の CN または特定の DN ノードが異常だった場合。
例外が発生しても、ノードのメタデータとデータはすぐには削除されません。GaussDB (DWS) は、コンポーネント gs_clean ツールを利用して、ローカル一時テーブルを自動的かつ定期的にクリーンアップします。スペースの継続的な拡大を防ぐために、一定期間後にデータがクリーンアップされていることを確認してください。
CN リトライ
CN 再試行機能をオンにすると、一時テーブルのデータがログに記録されます。データの一貫性を確保するため、一時テーブルを使用するときに CN 再試行スイッチの状態を切り替えることはお勧めできません。CN 再試行スイッチは常にオンまたはオフにしておいてください。一時テーブルを使用したセッション。
CN 再試行をオンにすると、DN ノードが異常に再起動され、一時テーブル内のデータが失われないことが保証されます。DN が再起動された後も、以前のセッションに引き続きアクセスできます。
一時テーブルのログを記録しないようにするには、次のようにします。
max_query_retry_times = 0 を設定します。
制約を使用する
- 上位層アプリケーションが接続プール メカニズムを使用して GaussDB (DWS) に接続する場合、一時テーブルを使用する場合は、接続プールに接続を戻す前に一時テーブルを積極的に削除して、接続プールによるデータ異常を避けることを強くお勧めします。接続が切断されていません。または、コマンドを使用して
DISCARD TEMP
セッションの一時テーブル情報をクリアします。 - ローカル一時テーブルは、拡張時に無視されます。
- gs_dump ローカル一時テーブルはサポートされていません。
クリックしてフォローし、できるだけ早く Huawei Cloud の新しいテクノロジーについて学びましょう
Lei Jun: Xiaomi の新しいオペレーティング システム ThePaper OS の正式版がパッケージ化されました。Gome App の抽選ページのポップアップ ウィンドウは創設者を侮辱しています。Ubuntu 23.10 が正式にリリースされました。金曜日を利用してアップグレードするのもいいでしょう! Ubuntu 23.10 リリース エピソード: ヘイトスピーチが含まれていたため、ISO イメージが緊急に「リコール」されました 23 歳の博士課程の学生が Firefox で 22 年間続いた「ゴーストバグ」を修正しました RustDesk リモート デスクトップ 1.2.3 がリリースされましたWayland を強化して TiDB 7.4 をサポート リリース: MySQL 8.0 と正式互換. Logitech USB レシーバーを取り外した後、Linux カーネルがクラッシュしました. マスターは Scratch を使用して RISC-V シミュレータをこすり、Linux カーネルを正常に実行しました. JetBrains が Writerside ツールを開始しました技術文書の作成に。