データ処理に GaussDB (DWS) のローカル一時テーブルを使用する方法

この記事は、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

使用するシーン

  1. 複雑なビジネス ロジックはローカル一時テーブルを使用して分割されます

    ビジネス SQL ステートメントが複雑すぎる場合は、ローカル一時テーブルを使用して実行の中間結果をキャッシュし、複雑なビジネス ロジックを複数の単純なステートメントに分割できます。単純な明細の統計情報がより準備され、分割されたビジネスの維持が容易になります。

  2. 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

データクリーニング:

  1. セッションが正常に終了します セッションが正常に
    終了すると、ローカル一時テーブルのテーブル定義とデータが削除されます。元のデータにはアクセスできなくなります。

  2. セッションが異常終了した場合、または現在の CN または特定の DN ノードが異常だった場合。
    例外が発生しても、ノードのメタデータとデータはすぐには削除されません。GaussDB (DWS) は、コンポーネント gs_clean ツールを利用して、ローカル一時テーブルを自動的かつ定期的にクリーンアップします。スペースの継続的な拡大を防ぐために、一定期間後にデータがクリーンアップされていることを確認してください。

CN リトライ

CN 再試行機能をオンにすると、一時テーブルのデータがログに記録されます。データの一貫性を確保するため、一時テーブルを使用するときに CN 再試行スイッチの状態を切り替えることはお勧めできません。CN 再試行スイッチは常にオンまたはオフにしておいてください。一時テーブルを使用したセッション。
CN 再試行をオンにすると、DN ノードが異常に再起動され、一時テーブル内のデータが失われないことが保証されます。DN が再起動された後も、以前のセッションに引き続きアクセスできます。
一時テーブルのログを記録しないようにするには、次のようにします。

max_query_retry_times = 0 を設定します。

制約を使用する

  1. 上位層アプリケーションが接続プール メカニズムを使用して GaussDB (DWS) に接続する場合、一時テーブルを使用する場合は、接続プールに接続を戻す前に一時テーブルを積極的に削除して、接続プールによるデータ異常を避けることを強くお勧めします。接続が切断されていません。または、コマンドを使用してDISCARD TEMPセッションの一時テーブル情報をクリアします。
  2. ローカル一時テーブルは、拡張時に無視されます。
  3. 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 ツールを開始しました技術文書の作成に。
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/4526289/blog/10119758