首页 > 其他分享 >如何使用GaussDB(DWS)的本地临时表进行数据处理

如何使用GaussDB(DWS)的本地临时表进行数据处理

时间:2023-10-17 11:14:03浏览次数:41  
标签:DWS CN 临时 GaussDB 会话 本地 数据处理 tmp1 gaussdb

本文分享自华为云社区《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 本地临时表。

点击关注,第一时间了解华为云新鲜技术~

标签:DWS,CN,临时,GaussDB,会话,本地,数据处理,tmp1,gaussdb
From: https://www.cnblogs.com/huaweiyun/p/17769211.html

相关文章

  • Mybatis自定义TypeHandler完成字段加解密And枚举数据处理
    Mybatis自定义TypeHandler完成字段加解密And枚举数据处理新增And查询对枚举数据处理定义枚举@GetterpublicenumUserEnum{HOLD_A_POST("在职",10),RESIGN("离职",20);privateStringname;privateIntegervalue;UserEnum(Stringname,......
  • 界面组件DevExpress WPF v23.1 - 进一步升级数据处理能力
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为中心......
  • 【C#】【System.Linq】一些便捷的数据处理方法(Range、Select)
    因为用习惯了Python中一些便捷的方法,随即查询C#中有没有类似的。 一、Range()方法在Python中,range(Start,End,Step)可以直接生成一个可迭代对象,便用于需要循环多次处理某些代码块:(注:Range方法中的End是开区间,range(1,10)实际的取值是(1~9))1foriteminrange(1,10):2print(ite......
  • CDGA 章节重点冲刺系列-第二章 数据处理伦理
    1.数据处理伦理1.数据伦理准则尊重他人行善原则:不伤害,利益最大伤害最小公正尊重法律和公众利益2.数据伦理相关法律法规1.欧盟数据保护条例GDPR公平、合法、透明目的限制数据最小化准确性存储限制诚信和保密问责制度3.在线数据伦理环境数据所有权被遗......
  • 升讯威在线客服系统的并发高性能数据处理技术:对接百度自动翻译
    我在业余时间开发维护了一款免费开源的升讯威在线客服系统,也收获了许多用户。对我来说,只要能获得用户的认可,就是我最大的动力。最近客服系统成功经受住了客户现场组织的压力测试,获得了客户的认可。客户组织多名客服上线后,所有员工同一时间打开访客页面疯狂不停的给在线客服发消......
  • GaussDB(DWS)案例丨MERGE场景下语句不下推引起的性能瓶颈问题
    本文分享自华为云社区《GaussDB(DWS)性能调优:MERGE场景下语句不下推引起的性能瓶颈问题案例》,作者:O泡果奶~。1、【问题描述】语句执行时间过长,且该语句performance执行计划中SQLDiagnosticInformation显示SQL语句不下推,理由为:TypeofRecordindualthatisnotarealtable......
  • 深入探讨Java Stream流:数据处理的新思维
    文章目录1.流式思想1.1输入流与输出流1.2Stream流2.使用Stream流的步骤3.获取Stream流3.1容器3.2数组4.Stream流中间操作方法4.1`filter(Predicate<?superT>predicate)`4.2`limit(longmaxSize)`4.3`skip(longn)`4.4`distinct()`4.5`sorted()`和`sorted(Compar......
  • 以下是一个比较复杂的R语言代码示例: ```R # 生成随机数 set.seed(123) data <- rnorm
    以下是一个比较复杂的R语言代码示例:#生成随机数set.seed(123)data<-rnorm(1000)#数据处理和分析data_mean<-mean(data)data_sd<-sd(data)data_median<-median(data)#创建一个绘图窗口par(mfrow=c(2,2))#绘制直方图hist(data,main="HistogramofDat......
  • modin pandas 大规模数据处理方案
    modin是一个可以快速替换原生pandas的方案,我们只需要替换一个简单的引用,就可以将pandas的数据处理速度有很大的提升modin支持与不少框架的集成(ray,dask,unidisk),目前modin对于常用read操作都有很不错的支持,参考图参考架构如下图,可以看出modin的扩展能力还是很强大的......
  • 【9.0】Fastapi表单数据处理
    【一】表单参数【1】定义视图fromfastapiimportAPIRouter,status,FormfrompydanticimportBaseModel,EmailStrfromtypingimportOptional,Union,Listapp04=APIRouter()###表单数据处理@app04.post("/login/")asyncdeflogin(#username用户名......