Postgresql 支持会话级别的临时表,表的存续期只在创建临时表的会话存活期间,会话退出后,临时表自动删除,表结构及数据也无法跨会话共享。KingbaseES 除了支持PG原生的临时表机制外,还支持类似oracle 的临时表机制,也就是全局临时表。全局临时表支持表结构共享,避免用户每次了都需要创建临时表的操作。以下以例子的形式,介绍PG 临时表与全局临时表的机制与差异。

一、PG 支持的临时表

会话A:创建临时表

  1. test=# create temporary table temp_t1(id integer);
  2. CREATE TABLE
  3. test=# insert into temp_t1 values(1);
  4. INSERT 0 1
  5. test=# \d
  6. List of relations
  7. Schema | Name | Type | Owner
  8. -----------+---------------------+-------+--------
  9. pg_temp_4 | temp_t1 | table | system
  10.  
  11. test=# select * from temp_t1;
  12. id
  13. ----
  14. 1

会话B:

  1. test=# select * from pg_temp_4.temp_t1;
  2. 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会话:创建临时表

  1. test=# create global temporary table g_temp_t1(id integer) on commit preserve rows;
  2. CREATE TABLE
  3. test=# insert into g_temp_t1 values(1);
  4. INSERT 0 1
  5. test=# select * from g_temp_t1;
  6. id
  7. ----
  8. 1
  9. (1 row)
  10.  
  11. test=# \d
  12. List of relations
  13. Schema | Name | Type | Owner
  14. -----------+---------------------+-------+--------
  15. pg_temp_4 | temp_t1 | table | system
  16. public | g_temp_t1 | table | system

B会话:可以访问A会话创建的临时表

  1. test=# select * from g_temp_t1;
  2. id
  3. ----
  4. (0 rows)
  5.  
  6. test=# insert into g_temp_t1 values(2);
  7. INSERT 0 1
  8. test=# select * from g_temp_t1;
  9. id
  10. ----
  11. 2

A会话:会话退出后,表结构还在,但A会话插入的数据没有了。

  1. test=# select * from g_temp_t1;
  2. id
  3. ----
  4. 1
  5. (1 row)
  6.  
  7. test=# \q
  8. [kingbase@dbhost03 ~]$ ksql -d test -U system
  9. ksql (V8.0)
  10. Type "help" for help.
  11.  
  12. test=# \d
  13. List of relations
  14. Schema | Name | Type | Owner
  15. --------+---------------------+-------+--------
  16. public | g_temp_t1 | table | system
  17. public | sys_stat_statements | view | system
  18.  
  19. test=# select * from g_temp_t1;
  20. id
  21. ----
  22. (0 rows)

KingbaseES 全局临时表总结:

  • 与oracle一样,默认是 on commit delete rows
  • 临时表数据只对当前会话或事务可见。每个会话只能查看和修改自己的数据。

三、普通表、临时表、全局临时表字典信息差异

  1. test=# select relnamespace::regnamespace, relname,relpersistence,relkind,reltablespace from pg_class where relname in ('t1','temp_t1','g_temp_t1');
  2. relnamespace | relname | relpersistence | relkind | reltablespace
  3. --------------+-----------+----------------+---------+---------------
  4. public | t1 | p | r | 0
  5. public | g_temp_t1 | s | r | 0
  6. pg_temp_5 | temp_t1 | t | r | 0

以下几点需要注意:

  • relkind 都为 r ,都是relation。
  • relpersistence 不同,全局临时表为 s ,普通临时表为 t
  • relnamespace 不同,普通临时表是创建在 pg_temp_xxx 模式下
  • 不管是全局临时表,还是普通临时表,默认都是unlogged 方式

四、性能比较

  1. test=# create table t1(id integer,name varchar(200));
  2. CREATE TABLE
  3. test=# create temporary table temp_t1(id integer,name varchar(200));
  4. CREATE TABLE
  5. test=# create global temporary table g_temp_t1(id integer,name varchar(200));
  6. CREATE TABLE
  7.  
  8. BEGIN
  9. for i in 1..200000 loop
  10. insert into g_temp_t1 values(i,repeat('a',200));
  11. end loop;
  12. END;
  13. /
  14. ANONYMOUS BLOCK
  15. Time: 1684.636 ms (00:01.685)
  16.  
  17. BEGIN
  18. for i in 1..200000 loop
  19. insert into temp_t1 values(i,repeat('a',200));
  20. end loop;
  21. END;
  22. /
  23. ANONYMOUS BLOCK
  24. Time: 741.746 ms
  25.  
  26. BEGIN
  27. for i in 1..200000 loop
  28. insert into t1 values(i,repeat('a',200));
  29. end loop;
  30. END;
  31. /
  32. ANONYMOUS BLOCK
  33. Time: 944.549 ms
  34.  
  35. test=# insert into temp_t1 select generate_series(1,500000),repeat('a',200);
  36. INSERT 0 500000
  37. Time: 484.780 ms

  38. test=# insert into g_temp_t1 select generate_series(1,500000),repeat('a',200);
  39. INSERT 0 500000
  40. Time: 2606.722 ms (00:02.607)

  41. test=# insert into t1 select generate_series(1,500000),repeat('a',200);
  42. INSERT 0 500000
  43. Time: 1856.685 ms (00:01.857)

通过观察日志,可以看到本地临时表、全局临时表基本不产生redo日志。但从实际执行效率看,全局临时表的效率是最差的,甚至不如普通的表。但这不妨碍全局临时表的使用,不产生Redo就是最好的优点。

五、全局临时表实现机制

根据全局临时表的relfilenode,我们查找了相关的表,发现数据库目录下有如下文件:

  1. -rw------- 1 kingbase kingbase 8192 Jun 16 15:45 t5_19820
  2. -rw------- 1 kingbase kingbase 8192 Jun 16 15:47 t4_19820

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

注意:一个用户可以打开的全局临时表的数量受参数 max_pending_gtfiles_per_backend 控制,默认 32 ,最大 1024.

KingbaseES 全局临时表的更多相关文章

  1. Oracle 临时事务表 全局临时表_global temporary table

    所有的操作都在一个事务里,事务提交后,此表清空,特别适合做插入删除频率特别高的临时表操作,比如插入完数据就开始查询,查询完就删掉等,用完就扔! 临时表分事务级临时表和会话级临时表. 事务级临时表只对当 ...

  2. MSSQLSERVER数据库- 判断全局临时表是否存在

    写一下今天遇到的一个问题. 今天因为一些作用域的问题,我使用了全局临时表,然后我在存储过程里使用了这么一段语句,想判断全局临时表是否存在,如果不存在,则将他DROP掉. 可是这段语句没用. if ex ...

  3. MS SQL 全局临时表的删除

    本来已经搜索到怎么删除了 如下: IF OBJECT_ID( 'tempdb..##TEMP_COPTD') IS NOT NULL Begin DROP TABLE ##TEMP_COPTD End ...

  4. sql server中的用户临时表和全局临时表的区别

    临时表分为: 本地临时表,仅限于当前访问者访问,创建方法去如下:create table #TableName(表结构)储存于数据库tempdb内(硬盘),当前用户断开连接(把当前的),自动删除如果使 ...

  5. Sql server 本地临时表、全局临时表的区别

    创建了本地临时表#Tmp.全局临时表##Tmp: 本地临时表: 取名以#开头.如:#Tmp(会自动加上一串后缀) 只有当前的连接可以访问 连接关闭后,本地临时表自动释放 全局临时表: 取名以##开头. ...

  6. KingbaseESV8R6临时表和全局临时表

    临时表概述 临时表用于存放只存在于事务或会话期间的数据.临时表中的数据对会话是私有的,每个会话只能看到和修改自己会话的数据. 您可以创建全局(global)临时表或本地(locall)临时表. 下表列 ...

  7. KingbaseES 全局索引

    概述:在分区表上创建的索引可分为全局索引和本地索引.全局索引包括全局非分区索引(Global Nonpartitioned Indexes)和全局分区索引(Global Partitioned Ind ...

  8. KingbaseES 全局索引是否因为DDL操作而变为Unusable ?

    前言 Oracle 在对分区做DDL操作时,会使分区全局索引失效,需要加上关键字update global indexes.KingbaseES 同样支持全局索引.那么,如果对分区表进行DDL操作,那 ...

  9. sq 如何创建全局的临时表。

    全局临时表的生命周期一直持续到创建会话(不是创建级别)才终止.例如,如果你在存储过程中创建全局临时表,当超出存储过程的范围时,该表并不会被销毁.当创建会话终止后,SQL Server才会自动尝试删除该 ...

随机推荐

  1. HDLBits->Circuits->Arithmetic Circuitd->3-bit binary adder

    Verilog实例数组 对于一个定义好的简单module,例如加法器之类,如果我们要对其进行几十次几百次的例化,并且这些例化基本都是相同的形式,那么我们肯定不能一个个的单独对其进行例化,此时我们就可以 ...

  2. Docker组成原理

    目录 Docker引擎 OCI容器标准 镜像 启动流程 本文是阅读<深入浅出Docker>的相关学习笔记 起初简单的以为Docker和容器是一种东西,后来才发现Docker是实现了Linu ...

  3. SAP APO - 简介

    SAP高级计划和优化(SAP APO)是SAP SCM中的关键模块之一,在供应链流程中控制供应网络计划,备件计划,TP / VS和需求计划. 它可以帮助组织在动态环境中管理其供应链流程. SAP AP ...

  4. 从UI Designer上面动态创建下拉列表

    在UI Desigher上创建一个新的列表 并创建2个值,code 和value 添加一个EventHandler 在EventHandler上面添加一个Operation 类型为script$dat ...

  5. C# --- SqlserverHelper帮助类、快速实现增删改查

    using System;using System.Data; using System.Data.SqlClient; namespace Demo.WorkerService { public c ...

  6. js导入excel&导出excel

    Excel导入 html代码 <button style={{ color: '#1890ff', fontSize: '14px', cursor: 'pointer' }} onClick= ...

  7. Pytorch从0开始实现YOLO V3指南 part4——置信度阈值和非极大值抑制

    本节翻译自:https://blog.paperspace.com/how-to-implement-a-yolo-v3-object-detector-from-scratch-in-pytorch ...

  8. ​​​​​​​ARCGIS API for Python进行城市区域提取

    ​ArcGIS API for Python主要用于Web端的扩展和开发,提供简单易用.功能强大的Python库,以及大数据分析能力,可轻松实现实时数据.栅格数据.空间数据等多源数据的接入和GIS分析 ...

  9. Windows对拍系统

    有个东西可以帮助对拍,告诉你两个程序的输出哪不一样(但是无法得知错误位置,聊胜于无吧) 一.打开计算机  二.在上方输入$cmd$,摁下回车 三.弹出对话窗如下,输入$fc +$空格,输入两个需要比较 ...

  10. redis 集群 slots are covered by nodes.

    原因数据数据损坏.需要修复 1.检测 redis-cli --cluster check 127.0.0.1:7000 2.检测结果 slots are covered by nodes3.进行修复 ...