GaussDB(DWS)临时表系列 - volatile临时表
GaussDB临时表系列 - volatile临时表
当前GaussDB(DWS)支持临时表功能。本篇文章介绍volatile临时表功能与基本用法。
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
-
DML与本地临时表类似,支持各种DML操作,包括INSERT、UPDATE、DELETE、UPSERT、MERGE、COPY。
与本地临时表一样,不支持INSERT OVERWRITE。
-
统计信息收集。统计信息不存储在系统表,支持动态采样。
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临时表和本地临时表的区别的核心是对元数据不再持久化,所以不受相关系统表膨胀的影响,进而导致出现非常慢的情况。稳定高负载下临时表创建性能。适合大量使用临时表进行数据加工的场景。
相关参数
-
max_volatile_memory 所有会话volatile临时表占用的最大内存。默认1GB。
-
max_volatile_tables 本会话支持可创建的最大的volatile tables个数。默认300。
-
GUC参数default_temptable_type可以设置 local或者volatile。用于控制
CREATE TEMP TABLE
的行为是本地临时表还是volatile临时表,而无需指定LOCAL
和VOLATILE
。
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
数据清理
- 会话正常退出
会话正常退出时, volatile临时表的表定义和数据都会被删除。无法再访问原来的数据。 - 会话异常退出或者当前CN或者某个DN节点异常时。
当有DN异常退出时,查询相关表会报错。出现异常时,节点的数据不会被立即删除。如果实例重启,会将volatile临时表的数据进行删除。
6. 使用约束
- 不支持分区表、delta表,hstore表。
- 不支持包含serial列。
- 不支持ALTER和GRANT操作。
- 不支持基于Volatile临时表创建视图。
- 不支持 CN-RETRY。
- 不能指定tablespace。
- 点赞
- 收藏
- 关注作者
评论(0)