GaussDB(DWS)临时表系列 - volatile临时表

举报
acydy 发表于 2025/09/03 09:28:29 2025/09/03
【摘要】 本文介绍DWS的volatile 临时表功能。

GaussDB临时表系列 - volatile临时表

当前GaussDB(DWS)支持临时表功能。本篇文章介绍volatile临时表功能与基本用法。

GaussDB临时表系列 - 本地临时表

volatile临时表与本地临时表区别是volatile临时表对元数据不再持久化。优势是系统表不再随着表数据增多而膨胀。

1. Volatile临时表语法

CREATE VOLATILE { 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 } ]

建表时需要指定VOLATILE TEMP或者VOLATILE TEMPORARY,表示创建VOLATILE临时表。

2. 创建Volatile 临时表

postgres=# create volatile temp table vtt1(a int,b int) distribute by hash(a);
CREATE TABLE

通过pg_get_tabledef查看表定义。不支持gsql \d查看。

gaussdb=# select pg_get_tabledef('vtt1');
            pg_get_tabledef
----------------------------------------
 CREATE VOLATILE TEMPORARY TABLE vtt1 (+
         a integer,                    +
         b integer                     +
 )                                     +
 WITH (orientation=row, compression=no)+
 DISTRIBUTE BY HASH(a)                 +
 TO GROUP group1;
(1 row)

通过get_volatile_pg_class查询表的原信息。与pg_class属性对应。

gaussdb=# select * from get_volatile_pg_class('vtt1');
-[ RECORD 1 ]----+--------------------------------------------------
oid              | 17255
relname          | vtt1
relnamespace     | 17250
reltype          | 17257
reloftype        | 0
relowner         | 10
relam            | 0
relfilenode      | 17255
reltablespace    | 1665
relpages         | 0
reltuples        | 0
relallvisible    | 0
reltoastrelid    | 0
reltoastidxid    | 0
reldeltarelid    | 0
reldeltaidx      | 0
relcudescrelid   | 0
relcudescidx     | 0
relhasindex      | f
relisshared      | f
relpersistence   | v
relkind          | r
relnatts         | 2
relchecks        | 0
relhasoids       | f
relhaspkey       | f
relhasrules      | f
relhastriggers   | f
relhassubclass   | f
relcmprs         | 1
relhasclusterkey | f
relrowmovement   | f
parttype         | n
relfrozenxid     | 1429301
relacl           |
reloptions       | {orientation=row,bucketnums=16384,compression=no}
relreplident     | d
relfrozenxid64   | 1429301
relmetaversion   | 2

3. Volatile 临时表 DML

  1. DML与本地临时表类似,支持各种DML操作,包括INSERT、UPDATE、DELETE、UPSERT、MERGE、COPY。

    与本地临时表一样,不支持INSERT OVERWRITE。

  2. 统计信息收集。统计信息不存储在系统表,支持动态采样。

gaussdb=# insert into vtt1 values(generate_series(1,100),generate_series(1,100),generate_series(1,100));
INSERT 0 100
gaussdb=# analyze vtt1;
ANALYZE
gaussdb=# select *from pv_runtime_relstats where relname = 'vtt1'; -- 查看表级统计信息
-[ RECORD 1 ]-+-----------------------------------------
nspname       | pg_temp_coordinator1_8_2_140394919428848
relname       | vtt1
relpages      | 2
reltuples     | 100
relallvisible | 0
relhasindex   | f
changes       | 100
level         | global
partname      |

gaussdb=# select *from pv_runtime_attstats where tablename = 'vtt1' and attname = 'c'; -- 查看级统计信息
-[ RECORD 1 ]----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
schemaname             | pg_temp_coordinator1_8_2_140394919428848
tablename              | vtt1
attname                | c
inherited              | f
null_frac              | 0
avg_width              | 4
n_distinct             | -1
n_dndistinct           | -1
most_common_vals       |
most_common_freqs      |
histogram_bounds       | {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100}
correlation            | 1
most_common_elems      |
most_common_elem_freqs |
elem_count_histogram   |
partname               |

4. 使用场景

在数据库处在高负载场景下,会导致数据库系统运行不稳定,平时毫秒级的建表语句可能需要几秒甚至更长时间。针对此问题,GaussDB(DWS)发布了VOLATILE临时表,解决此问题。

VOLATILE临时表和本地临时表的区别的核心是对元数据不再持久化,所以不受相关系统表膨胀的影响,进而导致出现非常慢的情况。稳定高负载下临时表创建性能。适合大量使用临时表进行数据加工的场景。

相关参数

  1. max_volatile_memory 所有会话volatile临时表占用的最大内存。默认1GB。

  2. max_volatile_tables 本会话支持可创建的最大的volatile tables个数。默认300。

  3. GUC参数default_temptable_type可以设置 local或者volatile。用于控制CREATE TEMP TABLE的行为是本地临时表还是volatile临时表,而无需指定LOCALVOLATILE

CN Retry

Volatile临时表将元数据存储到内存,如果遇到实例异常,元数据会被清除。业务需要进行重试。所以不支持CN Retry。

5. 原理

volatile临时表和本地临时表在同一session中共用同一schema。命令规则参见本地临时表

volatile临时表的relpersistence标识是’v’。

gaussdb=# select relname, relpersistence from get_volatile_pg_class('vtt1');
-[ RECORD 1 ]--+-----
relname        | vtt1
relpersistence | v

数据清理

  1. 会话正常退出
    会话正常退出时, volatile临时表的表定义和数据都会被删除。无法再访问原来的数据。
  2. 会话异常退出或者当前CN或者某个DN节点异常时。
    当有DN异常退出时,查询相关表会报错。出现异常时,节点的数据不会被立即删除。如果实例重启,会将volatile临时表的数据进行删除。

6. 使用约束

  1. 不支持分区表、delta表,hstore表。
  2. 不支持包含serial列。
  3. 不支持ALTER和GRANT操作。
  4. 不支持基于Volatile临时表创建视图。
  5. 不支持 CN-RETRY。
  6. 不能指定tablespace。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。