我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Kingbase 全局临时表

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Kingbase 全局临时表

Kingbase 全局临时表

Postgresql 支持会话级别的临时表,表的存续期只在创建临时表的会话存活期间,会话退出后,临时表自动删除,表结构及数据也无法跨会话共享。KINGBASE除了支持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 级别的。KINGBASE 如果用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)

KINGBASE 全局临时表总结:

  • 与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

每个文件实际对应一个事务,事务提交后,对应文件也就删除。

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Kingbase 全局临时表

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Kingbase 全局临时表

Postgresql 支持会话级别的临时表,表的存续期只在创建临时表的会话存活期间,会话退出后,临时表自动删除,表结构及数据也无法跨会话共享。KINGBASE除了支持PG原生的临时表机制外,还支持类似oracle 的临时表机制,也就是全局临时表。全局临时表支持
Kingbase 全局临时表
2017-02-20

KINGBASE 支持全局临时表

Postgresql 支持会话级别的临时表,表的存续期只在创建临时表的会话存活期间,会话退出后,临时表自动删除,表结构及数据也无法跨会话共享。KINGBASE除了支持PG原生的临时表机制外,还支持类似oracle 的临时表机制,也就是全局临时表。全局临时表支持
KINGBASE 支持全局临时表
2016-10-18

Oracle全局临时表的特点有哪些

全局临时表是一种特殊类型的表,它在整个数据库会话期间都存在,而不是只存在于特定的会话中。全局临时表的数据对所有的会话都是可见的,但是每个会话可以独立地向表中插入、更新和删除数据。全局临时表的数据在会话结束时会被自动清空,而不会持久保存在
Oracle全局临时表的特点有哪些
2024-04-19
2024-04-02

MySQL临时表

外部临时表是通过语句create temporary table...创建的临时表,临时表只在本会话有效,会话断开后,临时表数据会自动清理。 内部临时表主要有两类,一类是information_schema中临时表,另一类是会话执行查询时,如果执行计划中包含有
MySQL临时表
2019-07-13

MySQL之临时表

写在前面 本文一起看下MySQL的临时表。 1:什么是临时表 通过create temporary table t语句创建的表,就是临时表,临时表的临时体现在其生命周期是和会话一样的,当会话结束,即连接关闭时MySQL会自动将创建的临时表执
2023-08-17

SQLServer临时表的正确删除方式(sqlserver删除临时表)

临时表与一般的表不同,它是保存到tempDb表中。临时表的表名与你所建的表名也不一样,因为他要为不同人的相同操作创建不同的临时表。下文将为您分别示例正确和错误的删除操作,感兴趣的朋友一起看看吧
2023-02-16

MySQL临时表满了/临时表空间耗尽的解决方法

目录解决办法在 mysql 中,当你收到“临时表满了”的警报时,通常意味着 MySQL 在处理查询时创建的临时表空间已经耗尽。这可能会导致查询失败或性能下降。临时表通常用于处理一些需要排序、分组、或者使用临时数据存储
MySQL临时表满了/临时表空间耗尽的解决方法
2024-08-14

DB2 ORACLE 临时表创建

一、临时表     临时表(TEMPORARY TABLE)通常应用在需要定义临时集合的场合。但是,在大部分需要临时集合的时候,我们根本就不需要定义临时表。当我们在一条SQL语句中只使用一次临时集合时,我们可以使用嵌套表表达式来定义临时集合;当我们在一条SQL
DB2 ORACLE 临时表创建
2015-09-25

MySQL怎么建临时表

在MySQL中,可以使用CREATE TEMPORARY TABLE语句来创建临时表。临时表是一种只在当前会话有效的表,它的数据仅在当前连接有效,连接断开时表将自动删除。临时表的表结构和普通表一样,可以包含多个列和索引。以下是创建临时表
2023-10-27

SQL Server临时表的正确删除方式(sql server 删除临时表)

目录SQL Server编程客栈临时表的正确删除方式1、错误的删除操作:2、正确的删除方式:补充:SQL临时表的使用示例删除临时表SQL Server临时表的正确删除方式临时表与一般的表不同,它是保存到tempDb表中。临时表的表名与你所
2023-02-16

编程热搜

目录