postgresql 临时表空间及注意事项

--查看数据库临时表空间位置
--temp_tablespaces是表空间名称的列表,当列表中有一个以上名称时, PostgreSQL 每次临时对象被创建时选择一个列表中的随机数;
--除了在一个事务中之外,先后创建临时对象放置在列表连续的表空间中。 
--如果列表中选定的元素是一个空字符串, PostgreSQL 会自动使用当前数据库的缺省表空间
 select * from pg_settings where name = 'temp_tablespaces';
 
 --可以把pg的临时表空间建立在/dev/shm下面提高性能
 -- 新建目录结构.
  mkdir /dev/shm/tbs_tmp
 
 -- 创建表空间
 create tablespace tbs_tmp location '/dev/shm/tbs_tmp';
 
 --如果把目录建在/dev/shm目录下,需要改变目录权限,默认为root用户
  chown postgres.postgres /dev/shm

--设置session级别的临时表空间 
set session temp_tablespaces='tbs_tmp';




 --创建测试表
 postgres=#  create temp table test2 (id int);
CREATE TABLE
postgres=# \d+ test2
                       Table "pg_temp_5.test2"
 Column |  Type   | Modifiers | Storage | Stats target | Description 
--------+---------+-----------+---------+--------------+-------------
 id     | integer |           | plain   |              | 
Has OIDs: no
Tablespace: "tbs_tmp"

--插入数据
postgres=#  insert into test2 select generate_series(1,1000000);
INSERT 0 1000000

--可发现此目录明显增大,说明临时表的数据已经进到此目录
35M     /dev/shm/tbs_tmp/

--由于是临时表,故session退出后此数据就会被清空,临时表目录大小变为0
0       /dev/shm/tbs_tmp/




--如果要想让临时表空间的设置对所有的session永久生效,则需要修改配置文件
[postgres@staging27 tmp]$ vim /db/pgsql/data/postgresql.conf 
temp_tablespaces = 'tbs_tmp'
[postgres@staging27 tmp]$ pg_ctl reload -D /db/pgsql/data



--执行压力测试,进行大量的排序,需要使用到临时表空间
\setrandom id 140 12345678
\setrandom id2 1470 3023
\setrandom id3 1570 3213

select snapid,dbid,tbl,attnum,date,name,type,stattarget,storage,isnotnull,isdropped,avg_width,n_distinct,correlation from statsrepo.column order by name desc limit 11 offset :id;
select count(*) from statsrepo.index where name=(select name from statsrepo.index limit 1 offset :id ) ;
select snapid,dbid,tbl,attnum,date,name,type,stattarget,storage,isnotnull,isdropped,avg_width,n_distinct,correlation from statsrepo.column where snapid=:id2 order by name desc limit 11 offset :id2;
select count(*) from statsrepo.index where name=(select name from statsrepo.index limit 1 offset :id3+14 ) ;
select snapid,dbid,tbl,attnum,date,name,type,stattarget,storage,isnotnull,isdropped,avg_width,n_distinct,correlation from statsrepo.column where snapid=:id3 order by name desc limit 11 offset :id3;
select count(*) from statsrepo.index where name=(select name from statsrepo.index limit 1 offset :id2+1 ) ;


--执行测试,可知当临时表空间用完后,pg将会kill掉需要临时表空间的进程(不需要临时表空间的不受影响)
[postgres@staging27 tmp]$ pgbench -M prepared -f ./test.sql -n -r -c 6 -j 2 -T 1800 statsrepo > /tmp/pgbench_report_2.txt
Client 3 aborted in state 3: ERROR:  could not write block 102208 of temporary file: 设备上没有空间
HINT:  Perhaps out of disk space?
Client 1 aborted in state 3: ERROR:  could not write block 68958 of temporary file: 设备上没有空间

--监控其大小
while true; do du -sh /dev/shm/tbs_tmp/ /db/pgsql/data/base/pgsql_tmp/ ; sleep 1 ; done;

3.8G    /dev/shm/tbs_tmp/
3.9G    /dev/shm/tbs_tmp/
1.2G    /dev/shm/tbs_tmp/
0       /dev/shm/tbs_tmp/



--由于/dev/shm 空间有限,此时可以建立一个磁盘文件的临时表空间
 create tablespace disk_tbs_tmp location '/db/pgsql/data/base/pgsql_tmp';
 --修改配置文件
 temp_tablespaces='tbs_tmp,disk_tbs_tmp';
 
--进行压力测试后可知,如果磁盘文件不足,pg还是会kill掉需要临时表空间的进程
3.7G    /dev/shm/
5.6G    /db/pgsql/data/base/pgsql_tmp/
3.7G    /dev/shm/
5.6G    /db/pgsql/data/base/pgsql_tmp/
3.8G    /dev/shm/
5.6G    /db/pgsql/data/base/pgsql_tmp/
1.0G    /dev/shm/
4.6G    /db/pgsql/data/base/pgsql_tmp/
1.0G    /dev/shm/
606M    /db/pgsql/data/base/pgsql_tmp/
1.0G    /dev/shm/

 
 --dev/shm/ 目彔,其实是利用内存虚拝出来癿磁盘空间! 讵问速度是非帯快的,但建立在这个目录下的文件在下次开机时就消失了

你可能感兴趣的:(postgresql_优化)