postgresql----TEMPORARY TABLE和UNLOGGED TABLE
一.TEMPORARY|TEMP TABLE
会话级或事务级的临时表,临时表在会话结束或事物结束自动删除,任何在临时表上创建的索引也会被自动删除。除非用模式修饰的名字引用,否则现有的同名永久表在临时表存在期间,在本会话或事务中是不可见的。另外临时表对其他会话也是不可见的,但是会话级的临时表也可以使用临时表所在模式修饰的名字引用。
创建临时表的语法:
CREATE TEMP tbl_name()ON COMMIT{PRESERVE ROWS|DELETE ROWS|DROP};
PRESERVE ROWS:默认值,事务提交后保留临时表和数据
DELETE ROWS:事务提交后删除数据,保留临时表
DROP:事务提交后删除表
示例1
会话A:
创建临时表
test=# create temp table tbl_temp(a int);
CREATE TABLE
会话B:
1.在会话B查询临时表tbl_temp,提示表不存在
test=# select * from tbl_temp;
ERROR: relation "tbl_temp" does not exist
LINE 1: select * from tbl_temp;
2.但是在会话B查询pg_class中可以查到tbl_temp的记录
test=# select relname,relnamespace from pg_class where relname = 'tbl_temp';
relname | relnamespace
----------+--------------
tbl_temp | 16488
(1 row)
3.从上述查询结果中可以看到临时表tbl_temp属于16488的模式
test=# select nspname from pg_namespace where oid = 16488;
nspname
-----------
pg_temp_3
(1 row)
4.直接使用模式修饰的表名访问成功
test=# select * from pg_temp_3.tbl_temp ;
a
---
(0 rows)
会话A:
退出会话A
会话B:
再次查询tbl_temp时提示不存在
test=# select * from pg_temp_3.tbl_temp ;
ERROR: relation "pg_temp_3.tbl_temp" does not exist
LINE 1: select * from pg_temp_3.tbl_temp ;
^
示例2.创建ON COMMIT DELETE ROWS的临时表
test=# begin ;
BEGIN
test=# create temp table tbl_temp(a int) on commit delete rows;
CREATE TABLE
test=# insert into tbl_temp values (1);
INSERT 0 1
test=# select * from tbl_temp ;
a
---
1
(1 row) test=# commit ;
COMMIT
test=# select * from tbl_temp ;
a
---
(0 rows)
示例3.创建ON COMMIT DROP临时表
test=# begin ;
BEGIN
test=# create temp table tbl_temp(a int) on commit drop;
CREATE TABLE
test=# commit ;
COMMIT
test=# select * from tbl_temp;
ERROR: relation "tbl_temp" does not exist
LINE 1: select * from tbl_temp;
^
示例4.查询数据库中所有临时表
test=# select relname,nspname from pg_class join pg_namespace on(relnamespace=pg_namespace.oid) where pg_is_other_temp_schema(relnamespace);
relname | nspname
----------+-----------
tbl_test | pg_temp_2
(1 row)
二.UNLOGGED TABLE
unlogged table是为临时数据设计的,写入性能较高,但是当postgresql进程崩溃时会丢失数据。
创建一张普通表test和一张unlogged表test,测试性能情况
普通表:
test=# create table test(a int);
CREATE TABLE
test=# \timing
Timing is on.
test=# insert into test select generate_series(1,1000000);
INSERT 0 1000000
Time: 3603.715 ms
unlogged表
test=# create unlogged table testu(a int);
CREATE TABLE
Time: 12.920 ms
test=# insert into testu select generate_series(1,1000000);
INSERT 0 1000000
Time: 801.376 ms
比较以上两个结果,unlogged表的写性能是普通表的4.5倍。
杀死postgresql的主进程,重启DB服务
[root@MiWiFi-R1CL-srv ~]# ps -elf | grep postgres
S postgres - poll_s : ? :: /opt/pg9./bin/postgres -D /mnt/pgdata
S postgres - ep_pol : ? :: postgres: logger process
S postgres - poll_s : ? :: postgres: checkpointer process
S postgres - ep_pol : ? :: postgres: writer process
S postgres - ep_pol : ? :: postgres: wal writer process
S postgres - ep_pol : ? :: postgres: autovacuum launcher process
S postgres - ep_pol : ? :: postgres: stats collector process
S root - n_tty_ : pts/ :: /opt/pg9./bin/psql -d test -U postgres
S postgres - ep_pol : ? :: postgres: postgres test [local] idle
S root - pipe_w : pts/ :: grep postgres
[root@MiWiFi-R1CL-srv ~]# kill -
[root@MiWiFi-R1CL-srv ~]# rm -rf /mnt/pgdata/postmaster.pid
[root@MiWiFi-R1CL-srv ~]# su -l postgres -c '/opt/pg9.6/bin/pg_ctl -D /mnt/pgdata start'
server starting
[root@MiWiFi-R1CL-srv ~]# -- ::04.399 CST LOG: redirecting log output to logging collector process
-- ::04.399 CST HINT: Future log output will appear in directory "/var/log/pg_log".
再次查询unlogged表testu,发现数据已丢失
test=# select * from testu ;
a
---
(0 rows)
postgresql----TEMPORARY TABLE和UNLOGGED TABLE的更多相关文章
- Postgresql实战经验之alter table 开小差了
Postgresql实战经验之alter table 开小差了 今天需要将一张有数据的表中一个字段varchar 类型转换为timestamp类型,但是pg的alter table 语句却开小差,出现 ...
- MySQL删除大表时潜在的问题(drop table,truncate table)
来源于:https://www.cnblogs.com/CtripDBA/p/11465315.html,侵删,纯截图,避免吸引流量之嫌 case1,删除大表时,因为清理自适应hash索引占用的内容导 ...
- OpenFlow Switch学习笔记(五)——Group Table、Meter Table及Counters
本文主要详述OpenFlow Switch的另外两个主要组件——Group Table和Meter Table,它们在整个OpenFlow Swtich Processing中也起到了重要作用. 1. ...
- delete table 和 truncate table
delete table 和 truncate table 使用delete语句删除数据的一般语法格式: delete [from] {table_name.view_name} [where< ...
- 【翻译】Flink Table Api & SQL —— Table API
本文翻译自官网:Table API https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/tableApi.ht ...
- PostgreSQL中,database,schema,table之间关系
从逻辑上看,schema,table,都是位于database之下. 首先,在postgres数据库下建立表(相当于建立在public schema下): [pgsql@localhost bin]$ ...
- 对PostgreSQL中tablespace 与 database, table的理解
开始: 当前的tablesapce信息 pgsql=# select * from pg_tablespace; spcname | spcowner | spclocation | spcacl | ...
- 【SqlServer】empty table and delete table and create table
1.建表 1 IF object_id (N'表名', N'U') IS NULL CREATE TABLE 表名 ( 2 id INT IDENTITY (1, 1) PRIMARY KEY ,.. ...
- 【MySQL】 empty table and delete table.
1.MySQL生成删除满足条件的表的sql: 1 SELECT 2 CONCAT( 3 'DROP TABLE ', 4 GROUP_CONCAT(table_name), 5 ';' 6 ) AS ...
随机推荐
- 回调方法介绍之中国好室友篇(Java示例)
前言 在Java社区的各种开源工具中,回调方法的使用俯拾即是.所以熟悉回调方法无疑能加速自己对开源轮子的掌握.网上搜了一些文章,奈何对回调方法的介绍大多只停留在什么是回调方法的程度上.本篇文章尝试从回 ...
- 74hc165三片级联
3片74HC165进行级联,用于扩展IO口,读取外界设备的数据. unsigned int read_74165(void) { unsigned ; unsigned ; //三片74hc165,需 ...
- ti8127下godb 开发
http://download.cnet.com/GoDB/3000-2212_4-10306159.html源码rdk https://github.com/vasa-c/go-db github ...
- html dom基本操作
//div出滚动条: <div id="discussion" style="height:500px;overflow:auto;"></d ...
- unicode and utf-8
今晚听同事分享提到这个,简单总结下. Unicode字符集 Unicode的出现是因为ASCII等其他编码码不够用了,比如ASCII是英语为母语的人发明的,只要一个字节8位就能够表示26个英文字母了, ...
- tiny6410的linux操作系统实验开发
---恢复内容开始--- 1.前期由于2440 的4.3寸屏太小.后来修改程序准备在tiny6410增强版的S70屏上用.但是前期移植再用yaffs的文件系统,但是6410是(MLC)的磁盘,根本就不 ...
- System.Func<>与System.Action<>
使用并行编程可以同时操作多个委托,在介绍并行编程前先简单介绍一下两个泛型委托System.Func<>与System.Action<>. Func<>是一个能接受多 ...
- 有人问thinkphp的标签解析的时候为什么出现标签内内容空格丢失
举例如下 该代码被解析后 变为 并不是 active li bg 这里面的空格没有了 我试了多次,确实是这样,后来想了想 应该是框架解析的时候自动处理了,然后找了找框架代码 Template.cl ...
- laravel安装 redis 并驱动 session
1)composer 安装 redis composer require predis/predis 如果感兴趣,可以看一下这里 2)配置 redis 连接(config/database.php 配 ...
- Dubbo注册中心Zookeeper安装步骤
第一步:安装jdk 第二步:上传zookeeper至Linux 第三步:解压zookeeper安装包(/soft目录是我在根目录下建立的一个用户存放上传安装包的目录),解压命令tar -xvf /so ...