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 ...
随机推荐
- CMM已经落伍了,敏捷才是王道
首先强调一下,敏捷和有没有文档一点关系都没有.我只是对于CMM的那些文档感觉有些浪费. 看看那些文档,看看那些流程.想想那些伟大的软件作品,哪个是用CMM开发出来的? 作为测试工程师,程序员的你在CM ...
- 关于在Android中访问和使用到上下文变量
在监听器内部实现类中要引用上下文变量this的时候 一.采用类名.this的方法 FActivity.this 二.采用全局变量当做中间变量 1.先定义一个全局变量 private Context m ...
- Linux之zip压缩
1.压缩 对于test目录,使用 zip -rq test.zip test r表示递归压缩,q表示不显示过程 2.解压缩 unzip -q test.zip
- C++ 语言中的重载、内联、缺省参数、隐式转换等机制展现了很多优点
C++ 语言中的重载.内联.缺省参数.隐式转换等机制展现了很多优点,但是这些 优点的背后都隐藏着一些隐患.正如人们的饮食,少食和暴食都不可取,应当恰到好处. 我们要辨证地看待 C++的新机制,应该恰如 ...
- (转) 从ffmpeg中提取出YUV数据
有时需要从ffmpeg中提取出YUV数据用作预览,另存什么的. ffmpeg是先解码成YUV, 再以这个YUV作为输入进行编码,所以YUV数据有两种: 解码后的YUV数据, 以及 编码重建的YUV ...
- CentOS 7在桌面添加快捷方式
直接把 /usr/share/applications 对应的 xxx.desktop 文件复制到桌面就OK!比如要在桌面创建Google Chrome Browser的快捷方式,直接在找到 /usr ...
- erlang的Socket的积压的消息的数量
转自:http://blog.csdn.net/pkutao/article/details/8572216 {ok, Listen} = gen_tcp:listen(?defPort, [bina ...
- mysql 5.7 详细图文安装教程
官网下载太慢,可以上下载频道下载(mysql-installer-community-5.7.13.0.msi): http://download.csdn.net/download/tan3739/ ...
- mysqldump进行数据库的全备时,备份数据库的顺序是什么,就是先备份哪个库,然后再备份哪个库
需求描述: 今天在用mysqldump工具进行数据库的备份的时候,突然想了一个问题,比如我有10个库要进行备份 那么是先备份哪个,然后再备份哪个呢,所以,做了实验,验证下. 操作过程: 1.使用--a ...
- java.util.logging.Logger使用具体解释
java.util.logging.Logger不是什么新奇东西了,1.4就有了,但是由于log4j的存在,这个logger一直沉默着,事实上在一些測试性的代码中,jdk自带的logger比log4j ...