如何使用GaussDB(DWS)的本地臨時表進行數據處理

来源:https://www.cnblogs.com/huaweiyun/archive/2023/10/17/17769211.html
-Advertisement-
Play Games

GaussDB(DWS) 從8.2.1版本後支持三種形式的臨時表:本地臨時表、Volatile臨時表、全局臨時表。本地臨時表特點:表定義和數據都是會話相關,其他會話看不到本會話創建的本地臨時表。 ...


本文分享自華為雲社區《GaussDB(DWS)臨時表系列 - 本地臨時表》,作者: acydy 。

GaussDB(DWS) 從8.2.1版本後支持三種形式的臨時表:本地臨時表、Volatile臨時表、全局臨時表。本文先介紹DWS的本地臨時表功能。

本地臨時表特點:表定義和數據都是會話相關,其他會話看不到本會話創建的本地臨時表。元數據會持久化到系統表,集群節點異常出錯可以支持RETRY

語法與使用

CREATE [LOCAL] { TEMPORARY | TEMP } TABLE [ IF NOT EXISTS ] table_name
    ({ column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ]
        | table_constraint
        | LIKE source_table [ like_option [...] ] }
        [, ... ])
    [ WITH ( {storage_parameter = value} [, ... ] ) ]
    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS } ]

建表時需要指定TEMP或者TEMPORARY,表示創建本地臨時表。

  • ON COMMIT { PRESERVE ROWS | DELETE ROWS }

ON COMMIT選項決定在事務中執行創建臨時表操作,當事務提交時,此臨時表的後續操作。

  • PRESERVE ROWS(預設值):提交時不對臨時表做任何操作,臨時表及其表數據保持不變。建議使用此種類型。
  • DELETE ROWS:提交時刪除臨時表中數據。

其他部分與普通表相同。

gaussdb=# create temp table tmp1(a int,b int);
NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using round-robin as the distribution mode by default.
HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
CREATE TABLE

臨時表可以與非臨時表同名。如果同名,優先順序臨時表高於非臨時表。

gaussdb=# create temp table tmp1(a int,b int);
NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using round-robin as the distribution mode by default.
HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
CREATE TABLE
gaussdb=# insert into tmp1 values(1,1);
INSERT 0 1
gaussdb=# create table tmp1(a int,b int);
NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using round-robin as the distribution mode by default.
HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
CREATE TABLE
gaussdb=# select *from tmp1;
 a | b
---+---
 1 | 1
(1 row)

gaussdb=# select *from public.tmp1;
 a | b
---+---
(0 rows)

視圖:基於臨時表創建的視圖是臨時視圖。

postgres=# create view tmp_v1 as select *from tmp1;
NOTICE:  view "tmp_v1" will be a temporary view
CREATE VIEW

使用場景

  1. 複雜業務邏輯使用本地臨時表拆分

    如果業務SQL語句過於複雜,可以使用本地臨時表將執行的中間結果緩存下來,從而將複雜業務邏輯拆分成多個較簡單語句。簡單語句的統計信息更為準備,且拆分後的業務更易於維護。

  2. 支持CN節點出現異常。
    GaussDB(DWS) 是一款分散式架構的資料庫。有多個Coordinator(CN),關係對等。客戶端可以連接任意一個CN。CN上存有表的元數據信息。在執行DDL時,會在所有DN上進行元數據的同步,保證數據一致性。如果某個CN出現異常,會導致創建表、刪除表等操作執行失敗,進而導致整個作業執行失敗。

    在這種場景,可以使用本地臨時表。本地臨時表只在當前會話可見。執行本地臨時表的創建、ALTER、刪除等操作時,只會在當前CN進行元數據的修改。這樣可以不受其他CN節點異常的影響,保證業務使用連續性。

原理

臨時表在元數據上與普通表的區別是臨時表由於在其他會話不可見,所以會建在一個只屬於當前會話的schema。本會話第一次創建臨時表時會同時建立這個會話的schema。每一個會話的臨時schema都不同。

會話1:

gaussdb=# create temp table tmp1(a int,b int);
NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using round-robin as the distribution mode by default.
HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
CREATE TABLE
gaussdb=# \d+ tmp1
       Table "pg_temp_coordinator1_65_3_140257888512760.tmp1"
 Column |  Type   | Modifiers | Storage | Stats target | Description
--------+---------+-----------+---------+--------------+-------------
 a      | integer |           | plain   |              |
 b      | integer |           | plain   |              |
Has OIDs: no
Distribute By: ROUND ROBIN
Location Nodes: ALL DATANODES
Options: orientation=row, compression=no:

會話2, 查詢不到tmp1表。

gaussdb=# select * from tmp1;
ERROR:  relation "tmp1" does not exist
LINE 1: select * from tmp1;
                      ^

臨時schema的命名規則:pg_temp_Coordinator名_timelineID_全局自增ID_threadID

Coordinator名:CN名稱,隔離不同CN創建的schema。

timelineID:在節點重啟後會增加,用於判斷此schema是否已經無效。

全局自增ID:單個CN上自增ID。同一個CN不用會話自增ID不同。

元數據:本地臨時表的relpersistence標識是’t’。

gaussdb=# select relname, relpersistence from pg_class where relname = 'tmp1';
 relname | relpersistence
---------+----------------
 tmp1    | t

數據清理:

  1. 會話正常退出
    會話正常退出時, 本地臨時表的表定義和數據都會被刪除。無法再訪問原來的數據。

  2. 會話異常退出或者當前CN或者某個DN節點異常時。
    出現異常時,節點的元數據和數據不會被立即刪除。 GaussDB(DWS)依賴組件gs_clean工具進行本地臨時表的自動定期清理。保證數據再一段周期後得到清理,防止空間持續膨脹。

CN Retry

CN Retry功能開啟時會為臨時表數據記錄日誌,為保證數據一致性,在使用臨時表時不建議切換CN Retry開關狀態,保持使用臨時表的會話中CN Retry開關始終處於打開狀態或者關閉狀態。
在打開CN Retry時,DN節點異常重啟,臨時表的數據可以保證不丟失。DN重啟後,仍可以訪問之前的會話。
如果希望臨時表不記錄日誌:

set max_query_retry_times = 0;

使用約束

  1. 如果上層應用,使用了連接池機制連接GaussDB(DWS),在使用臨時表時,強烈建議將連接歸還連接池之前,將臨時表主動刪除,避免造成連接未斷開導致的數據異常。或者使用命令DISCARD TEMP清理會話的臨時表信息。
  2. 擴容時忽略本地臨時表。
  3. 不支持gs_dump 本地臨時表。

點擊關註,第一時間瞭解華為雲新鮮技術~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 基礎說明 本文根據 RFC4226 和 RFC6238 文檔,詳細的介紹 HOTP 和 TOTP 演算法的原理和實現。 兩步驗證已經被廣泛應用於各種互聯網應用當中,用來提供安全性。對於如何使用兩步驗證,大家並不陌生,無非是開啟兩步驗證,然後出現一個二維碼,使用支持兩步驗證的移動應用比如 Google ...
  • 關於HelixToolkit-這個3D呈現的交互處理推薦使用,因為功能比較強大 一個開源3D庫,根據MIT許可證獲得許可。MIT許可證非常寬鬆,允許在專有軟體中使用。該庫基於 .NET,目前專註於 WPF 平臺。 HelixToolkit是.NET Framework的一個開源3D圖形庫,它主要用於 ...
  • 需求:格式為exp的文件,具有json結構,替換掉其中某些數據 解決方法:讀取excel,用npoi讀取指定內容,在exp中找到特定結構,然後替換 讀取excel文件 讀取其他格式的文件也是用此方法 public void OpenExcel() { Microsoft.Win32.OpenFile ...
  • 我們在調試Web頁面時,期望能使用80埠調試(比如本博客站點的每篇博客,我在發佈之前,均需要在我的Mac電腦進行博客內容和樣式的調試和校驗)。而Mac電腦的80埠預設被系統Apache服務占用,下麵分享我常用的2種使用80埠調試Web站點頁面的辦法…… ...
  • 【學習課程】:【【小白入門 通俗易懂】2021韓順平 一周學會Linux】 https://www.bilibili.com/video/BV1Sv411r7vd/?p=14&share_source=copy_web&vd_source=2c07d62293f5003c919b2df9b2e054 ...
  • 在Linux系統中,測試硬碟的性能一般使用fio工具實現,fio是Flexible I/O Tester的縮寫。是一個常受歡迎的、用於測試存儲性能的工具,而且還可以模擬多種不同的I/O模式和工作負載。 一般我們要測試一塊硬碟的性能,一般需要進行隨機寫入測試、隨機讀取測試、順序寫入測試、順序讀取測試和 ...
  • 本章介紹了MongoDB複製集的配置和使用方法,如何初始化和添加節點到複製集,驗證主節點的寫入和從節點的讀取功能。瞭解如何查詢複製集的狀態,包括成員的健康狀況、同步信息和角色等。最後,我們介紹瞭如何配置複製集的安全認證,包括創建用戶和生成keyFile文件,並演示了使用認證信息連接複製集的方式。通過... ...
  • 1 背景 在講述分散式事務的概念之前,我們先來回顧下事務相關的一些概念。 1.1 事務的基本概念 就是一個程式執行單元,裡面的操作要麼全部執行成功,要麼全部執行失敗,不允許只成功一半另外一半執行失敗的事情發生。例如一段事務代碼做了兩次資料庫更新操作,那麼這兩次資料庫操作要麼全部執行成功,要麼全部回滾 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...