--查看数据库临时表空间位置 --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/ 目彔,其实是利用内存虚拝出来癿磁盘空间! 讵问速度是非帯快的,但建立在这个目录下的文件在下次开机时就消失了