KingbaseES 全局临时表
Postgresql 支持会话级别的临时表,表的存续期只在创建临时表的会话存活期间,会话退出后,临时表自动删除,表结构及数据也无法跨会话共享。KingbaseES 除了支持PG原生的临时表机制外,还支持类似oracle 的临时表机制,也就是全局临时表。全局临时表支持表结构共享,避免用户每次了都需要创建临时表的操作。以下以例子的形式,介绍PG 临时表与全局临时表的机制与差异。
一、PG 支持的临时表
会话A:创建临时表
test=# create temporary table temp_t1(id integer);
CREATE TABLE
test=# insert into temp_t1 values(1);
INSERT 0 1
test=# \d
List of relations
Schema | Name | Type | Owner
-----------+---------------------+-------+--------
pg_temp_4 | temp_t1 | table | system test=# select * from temp_t1;
id
----
1
会话B:
test=# select * from pg_temp_4.temp_t1;
ERROR: cannot access temporary tables of other sessions
PG 临时表机制总结:
- 创建语法上,临时表可以选择global or local,但实际都是local的(PG 后续语法不再支持 global),其它会话不能访问(实际是空表可以访问,有数据情况下就会报错)。
- ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP }
- PRESERVE ROWS 表示临时表的数据在事务结束后保留。默认使用的是PRESERVE ROWS。
- DELETE ROWS 表示临时表的数据在事务结束后truncate掉。
- DROP 表示临时表在事务结束后删除。
- 当会话第一次创建临时表时,会自动创建 SYS_TEMP_XXX 模式,该会话的所有临时表都放在该模式下。如果表里有可能产生toast存储的字段,也会同时创建pg_toast_temp_XXX模式。
- 临时表在会话结束后会自动删除(或者在事务结束后删除on commit drop),也就是说每个会话需要使用临时表的话需要重新创建。
- 如果有临时表和非临时表重名了, 那么默认是使用临时表的,因为临时表模式在search_path 参数值里是排在最前面的。如果要使用非临时表,需要带上schema,如schema.table。
- 临时表上创建的索引也是临时的。
- 临时表的统计信息不会被autovacuum daemon自动收集,所以如果有复杂查询的话,最好在有DML后执行analyze。
二、全局临时表
PG 建临时表时也可以用 create global temporary table,但实际创建的都是local 级别的。KingbaseES 如果用create global temporary table,实际意义上创建的是全局的临时表,临时表的机制与oracle相似。
A会话:创建临时表
test=# create global temporary table g_temp_t1(id integer) on commit preserve rows;
CREATE TABLE
test=# insert into g_temp_t1 values(1);
INSERT 0 1
test=# select * from g_temp_t1;
id
----
1
(1 row) test=# \d
List of relations
Schema | Name | Type | Owner
-----------+---------------------+-------+--------
pg_temp_4 | temp_t1 | table | system
public | g_temp_t1 | table | system
B会话:可以访问A会话创建的临时表
test=# select * from g_temp_t1;
id
----
(0 rows) test=# insert into g_temp_t1 values(2);
INSERT 0 1
test=# select * from g_temp_t1;
id
----
2
A会话:会话退出后,表结构还在,但A会话插入的数据没有了。
test=# select * from g_temp_t1;
id
----
1
(1 row) test=# \q
[kingbase@dbhost03 ~]$ ksql -d test -U system
ksql (V8.0)
Type "help" for help. test=# \d
List of relations
Schema | Name | Type | Owner
--------+---------------------+-------+--------
public | g_temp_t1 | table | system
public | sys_stat_statements | view | system test=# select * from g_temp_t1;
id
----
(0 rows)
KingbaseES 全局临时表总结:
- 与oracle一样,默认是 on commit delete rows
- 临时表数据只对当前会话或事务可见。每个会话只能查看和修改自己的数据。
三、普通表、临时表、全局临时表字典信息差异
test=# select relnamespace::regnamespace, relname,relpersistence,relkind,reltablespace from pg_class where relname in ('t1','temp_t1','g_temp_t1');
relnamespace | relname | relpersistence | relkind | reltablespace
--------------+-----------+----------------+---------+---------------
public | t1 | p | r | 0
public | g_temp_t1 | s | r | 0
pg_temp_5 | temp_t1 | t | r | 0
以下几点需要注意:
- relkind 都为 r ,都是relation。
- relpersistence 不同,全局临时表为 s ,普通临时表为 t
- relnamespace 不同,普通临时表是创建在 pg_temp_xxx 模式下
- 不管是全局临时表,还是普通临时表,默认都是unlogged 方式
四、性能比较
test=# create table t1(id integer,name varchar(200));
CREATE TABLE
test=# create temporary table temp_t1(id integer,name varchar(200));
CREATE TABLE
test=# create global temporary table g_temp_t1(id integer,name varchar(200));
CREATE TABLE BEGIN
for i in 1..200000 loop
insert into g_temp_t1 values(i,repeat('a',200));
end loop;
END;
/
ANONYMOUS BLOCK
Time: 1684.636 ms (00:01.685) BEGIN
for i in 1..200000 loop
insert into temp_t1 values(i,repeat('a',200));
end loop;
END;
/
ANONYMOUS BLOCK
Time: 741.746 ms BEGIN
for i in 1..200000 loop
insert into t1 values(i,repeat('a',200));
end loop;
END;
/
ANONYMOUS BLOCK
Time: 944.549 ms test=# insert into temp_t1 select generate_series(1,500000),repeat('a',200);
INSERT 0 500000
Time: 484.780 ms
test=# insert into g_temp_t1 select generate_series(1,500000),repeat('a',200);
INSERT 0 500000
Time: 2606.722 ms (00:02.607)
test=# insert into t1 select generate_series(1,500000),repeat('a',200);
INSERT 0 500000
Time: 1856.685 ms (00:01.857)
通过观察日志,可以看到本地临时表、全局临时表基本不产生redo日志。但从实际执行效率看,全局临时表的效率是最差的,甚至不如普通的表。但这不妨碍全局临时表的使用,不产生Redo就是最好的优点。
五、全局临时表实现机制
根据全局临时表的relfilenode,我们查找了相关的表,发现数据库目录下有如下文件:
-rw------- 1 kingbase kingbase 8192 Jun 16 15:45 t5_19820
-rw------- 1 kingbase kingbase 8192 Jun 16 15:47 t4_19820
每个文件实际对应一个事务,事务提交后,对应文件也就删除。
注意:一个用户可以打开的全局临时表的数量受参数 max_pending_gtfiles_per_backend 控制,默认 32 ,最大 1024.
KingbaseES 全局临时表的更多相关文章
- Oracle 临时事务表 全局临时表_global temporary table
所有的操作都在一个事务里,事务提交后,此表清空,特别适合做插入删除频率特别高的临时表操作,比如插入完数据就开始查询,查询完就删掉等,用完就扔! 临时表分事务级临时表和会话级临时表. 事务级临时表只对当 ...
- MSSQLSERVER数据库- 判断全局临时表是否存在
写一下今天遇到的一个问题. 今天因为一些作用域的问题,我使用了全局临时表,然后我在存储过程里使用了这么一段语句,想判断全局临时表是否存在,如果不存在,则将他DROP掉. 可是这段语句没用. if ex ...
- MS SQL 全局临时表的删除
本来已经搜索到怎么删除了 如下: IF OBJECT_ID( 'tempdb..##TEMP_COPTD') IS NOT NULL Begin DROP TABLE ##TEMP_COPTD End ...
- sql server中的用户临时表和全局临时表的区别
临时表分为: 本地临时表,仅限于当前访问者访问,创建方法去如下:create table #TableName(表结构)储存于数据库tempdb内(硬盘),当前用户断开连接(把当前的),自动删除如果使 ...
- Sql server 本地临时表、全局临时表的区别
创建了本地临时表#Tmp.全局临时表##Tmp: 本地临时表: 取名以#开头.如:#Tmp(会自动加上一串后缀) 只有当前的连接可以访问 连接关闭后,本地临时表自动释放 全局临时表: 取名以##开头. ...
- KingbaseESV8R6临时表和全局临时表
临时表概述 临时表用于存放只存在于事务或会话期间的数据.临时表中的数据对会话是私有的,每个会话只能看到和修改自己会话的数据. 您可以创建全局(global)临时表或本地(locall)临时表. 下表列 ...
- KingbaseES 全局索引
概述:在分区表上创建的索引可分为全局索引和本地索引.全局索引包括全局非分区索引(Global Nonpartitioned Indexes)和全局分区索引(Global Partitioned Ind ...
- KingbaseES 全局索引是否因为DDL操作而变为Unusable ?
前言 Oracle 在对分区做DDL操作时,会使分区全局索引失效,需要加上关键字update global indexes.KingbaseES 同样支持全局索引.那么,如果对分区表进行DDL操作,那 ...
- sq 如何创建全局的临时表。
全局临时表的生命周期一直持续到创建会话(不是创建级别)才终止.例如,如果你在存储过程中创建全局临时表,当超出存储过程的范围时,该表并不会被销毁.当创建会话终止后,SQL Server才会自动尝试删除该 ...
随机推荐
- 华为AppLinking中统一链接的创建和使用
运营的同学近期在准备海外做一波线下投放,涉及到海外的Google Play,iOS设备的App Store,以及华为渠道的AppGallery. 其中运营希望我们能够将三个平台的下载整合到一个链接 ...
- js与java encodeURI 进行编码与解码
JS escape()使用转义序列替换某些字符来对字符串进行编码 JavaScript 中国 编码后 JavaScript %u4E2D%u56FD unescape()对使用 encodeUR ...
- 使用docker buildx打包发布多平台镜像
2022-07-07 个人比较喜欢影视作品,下载了大量的剧集视频,有些文件的命名不规范,就需要重新命名,之前是用的一款 renamer 客户端软件,用起来不太爽就自己做了个 bs 架构的重命名软件并开 ...
- 【跟着大佬学JavaScript】之lodash防抖节流合并
前言 前面已经对防抖和节流有了介绍,这篇主要看lodash是如何将防抖和节流合并成一个函数的. 初衷是深入lodash,学习它内部的好代码并应用,同时也加深节流防抖的理解.这里会先从防抖开始一步步往后 ...
- 树莓派实战:微信机器人(itchat实现)
背景 楼主有一台树莓派4B开发板(8G内存版),是目前的顶配机型.这一年来的业余时间,除了写Java.架构方面的文章,也陆续折腾了不少树莓派上的好玩小项目,在此新开一个树莓派实战的文章系列,分享给粉丝 ...
- vue2,vue指令和选项
vue特点 mvvm框架 响应式(声明式) 组件化(支持自定义组件) 丰富的指令(Dom功能的抽象) 基于选项(template,data,computed,watch,methods) vue文档集 ...
- Vue 路由懒加载, VueRouter一步完成Vue的路由懒加载 一行代码搞定懒加载
Vue Router路由配置中的component里面配置即可 1 // 路由懒加载的方式加载组件 2 3 component: () => import('@/views/Detail'), ...
- GitHub中Fork来的仓库如何进行双向更新
一.做点贡献 想对别人的某个仓库"做点贡献"怎么办? 1. Fork该仓库 首先Fork该仓库,本文以git-learn这个仓库为例 这样自己的账号下就会出现这样一个仓库 2. C ...
- 串口通信:接受数据(仿真task写法)
1.功能描述 设计一个串口数据接收模块.能够以设定的波特率(与发射端口速率匹配)接收数据,并输出保存到一个寄存器中. 2.过程描述 ①边沿检测器,识别出起始位时让接收使能端有效.这里需要排除边沿脉冲的 ...
- jdbc 01: 连接mysql,并实现数据插入
jdbc连接mysql,并实现数据插入 package com.examples.jdbc.o1_连接与插入; import java.sql.*; /* jdbc数据库连接六步 */ public ...