大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说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
每个文件实际对应一个事务,事务提交后,对应文件也就删除。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/6097.html