Oracle临时表空间(Temporary Tablespace)主要用来存储数据库运行中产生的临时对象,例如SQL排序效果集,临时表等,这些对象的生存周期只有会话。本文总结了Oralce中涉及临时表空间的管理和优化操作。
一、临时表空间简介
在执行SQL时,经常会遇到排序操作,当效果集无法放在内存中时,Oracle就会利用临时表空间来排序。临时表空间中不能创建持久性对象,用户唯一能创建的就是临时表,而且随着用户会话退出,临时表也会被删除。
当Oracle安装完成时,默认就已经创建了1个临时表空间TEMP,且全部未显式指定利用其他临时表空间的用户,都会利用这个临时表空间,利用下面的SQL可以查询数据库的默认临时表空间:
- select property_name, property_value
- from database_properties
- where property_name='DEFAULT_TEMP_TABLESPACE';
复制代码
临时表空间的底层利用的是临时文件(tempfile),通常采用本地管理策略(Locally Management),临时表空间不会生成redo日志,根据其服务的实例数量还可以分为:
- 本地临时表空间,通常保存在本地磁盘,只能给一个实例访问
- 共享临时表空间:通常保存在共享存储上,可以被多个实例同时访问
二、临时表空间管理
虽然Oracle初始已经建立了一个临时表空间,但用户也可以根据自身需求对临时表空间进行定制。
2.1 创建临时表空间
利用create temporary tablespace语句创建临时表空间,语法和创建平凡表空间类似,不同点在于其需要指定temporary和tempfile关键字。
示例:创建一个临时表空间temptbs01,文件巨细20M,reuse关键字指示假如文件已存在则重用:
- create temporary tablespace temptbs01
- tempfile '/u01/app/oracle/oradata/PROD/temptbs01.dbf' size 20m reuse;
复制代码
假如开启了OMF特性,可以不指定文件属性,只提供表空间名称即可:
- create temporary tablespace temptbs02;
复制代码
创建好的临时表空间及其临时文件信息可以通过dba_temp_files检察:
- select tablespace_name, file_name,status, autoextensible from dba_temp_files;
复制代码
2.2 修改临时表空间
可以用alter tablespace语句修改表空间属性,例如添加,删除临时文件,修改在线/离线状态,调整临时文件巨细等。
示例:为temptbs01添加一个数据文件,巨细10M,自动扩展:
- alter tablespace temptbs01
- add tempfile '/u01/app/oracle/oradata/PROD/temptbs01_2.dbf' size 10M
- autoextend on next 10m;
复制代码
示例:将上面添加的数据文件删除:
- alter tablespace temptbs01
- drop tempfile '/u01/app/oracle/oradata/PROD/temptbs01_2.dbf';
复制代码
示例:修改temptbs01临时文件的在线/离线状态(不能修改临时表空间的在线/离线状态):
- alter database tempfile '/u01/app/oracle/oradata/PROD/temptbs01.dbf' offline;
- alter database tempfile '/u01/app/oracle/oradata/PROD/temptbs01.dbf' online;
复制代码
示例:修改临时文件的巨细,将temptbs01的临时文件修改为30m:
- alter database tempfile '/u01/app/oracle/oradata/PROD/temptbs01.dbf' resize 30m;
复制代码
2.3 检察空间利用情况
查询dba_temp_free_space视图可以检察当前临时表空间的利用情况,free_space字段指示了可用空间:
- select * from dba_temp_free_space;
复制代码
2.4 紧缩临时表空间
对于文件可以自动扩展的临时表空间,当空间不敷时,Oracle会自动扩展文件巨细,一个很大的任务,就可以导致临时表空间消耗很多磁盘。假如日常用不到这么大的表空间,可以手动紧缩以回收磁盘空间。
回收表空间是一个在线操作,正在利用的会话可以正常分配空间,不受影响。
示例:用alter tablespace … shrink space …; 可以回收可用空间,keep子句指示尽量紧缩到25m:
- alter tablespace temptbs01 shrink space keep 25m;
复制代码
或:用alter tablespace … shrink tempfile …; 指定紧缩某个临时文件:
- alter tablespace temptbs01 shrink tempfile '/u01/app/oracle/oradata/PROD/temptbs01.dbf' keep 20m;
复制代码
2.5 删除临时表空间
利用alter tablespace … drop…;语句可以删除临时表空间,你可以选择是否保留临时文件,假如保留临时文件,下次再次指定同名文件时需要用reuse关键字重用文件。
示例:删除临时表空间temptbs01及其临时文件,省略including contents and datafiles子句则会保留临时文件:
- drop tablespace temptbs01 including contents and datafiles;
复制代码
三、利用临时表空间组
临时表空间组是一个逻辑概念,它由1或多个临时表空间组成,可以作为一个团体分配给数据库或用户利用。在高并发情况,多个临时表空间可以更好的减少争用现象,并且Oracle的并行执行特性也可以利用多个临时表空间提升执行性能。
临时表空间组不需要显式创建,只需要利用alter tablespace … tablespace group …; 将某个临时表空间加入组即可(创建表空间时也可加入)。
第一步,将temptbs01加入组group1,这会隐式创建group1:
- alter tablespace temptbs01 tablespace group group1;
复制代码
第二步(可选),可以继续将其他临时表空间加入组,组成员的数量没有限制:
- alter tablespace temptbs02 tablespace group group1;
复制代码
通过dba_tablespace_groups可以看到现在group1中已经有2个表空间:
- select * from dba_tablespace_groups;
复制代码
第三步:将组指定为数据库默认临时表空间(alter database)或指定给用户(alter user):
- alter database default temporary tablespace group1;
- alter user hr temporary tablespace group1;
复制代码
利用alter database指定空的组名可以将临时表空间移出组,当最后一个表空间移出组时,组自动删除(先取消引用):
- alter tablespace temptbs01 tablespace group '';
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |