关于临时表空间,在日常生产中会遇到的问题

Oracle临时表空间主要用来做查询和存放一些缓冲区数据。临时表空间消耗的主要原因是需要对查询的中间结果进行排序。在某些Oracle一体机,可能会进行大量的运算和排序,产生大量的缓冲区数据。这个时候就会对临时表空间产生压力,可能我们去看的时候查到临时表空间的使用率还远远没有到百分之百,但这些缓冲区数据的堆放不紧凑,高水位线这时候已经很高了,新的缓冲区数据进不来,应用程序会有错误。

查看临时表空间高水位线:

SELECT d.tablespace_name "Name",

TO_CHAR(NVL(a.bytes / 1024 / 1024, 0),'99999990.900') "Size (M)",

TO_CHAR(NVL(t.hwm, 0)/1024/1024,'99999999.999') "HWM (M)",

TO_CHAR(NVL(t.hwm / a.bytes * 100, 0), '990.00') "HWM %",

TO_CHAR(NVL(t.bytes/1024/1024,0),'99999999.999') "Using (M)",

TO_CHAR(NVL(t.bytes / a.bytes * 100, 0), '990.00') "Using %"

FROM sys.dba_tablespaces d,

(select tablespace_name, sum(bytes) bytes from dba_temp_files group by tablespace_name) a,

(select tablespace_name, sum(bytes_cached) hwm, sum(bytes_used) bytes from gv$temp_extent_pool group by tablespace_name) t

WHERE d.tablespace_name = a.tablespace_name(+)

AND d.tablespace_name = t.tablespace_name(+)

AND d.extent_management like 'LOCAL'

AND d.contents like 'TEMPORARY';

收缩临时表空间

排序等操作使用的临时段,使用完成后会被标记为空闲,表示可以重用,占用的空间不会立即释放,有时候临时表空间会变得非常大,此时可以通过收缩临时表空间来释放没有使用的空间。收缩临时表空间是ORACLE 11g新增的功能。

SQL> ALTER TABLESPACE TEMP SHRINK SPACE KEEP 8G;

SQL> ALTER TABLESPACE TEMP SHRINK TEMPFILE '/u01/app/oracle/oradata/GSP/temp02.dbf' keep 3000M

对于这两个命令,可以指定可选的KEEP 子句,该子句定义了表空间/临时文件可收缩到的下限。

如果忽略KEEP 子句,则只要满足其它存储属性,数据库就会尽可能尝试收缩表空间/临时文件(所有当前使用的区的总空间)。此操作需联机执行。但是,如果所分配的当前使用的一些区超出了收缩估计值,系统将等待这些区被释放以完成收缩操作。


---执行以下命令释放temp表空间(详见文档:How to Release the Temp LOB Space and Avoid Hitting ORA-1652 (文档 ID 802897.1) )

declare

clb clob;

ch varchar2(32767);

k number;

begin

dbms_lob.createtemporary(clb,true,dbms_lob.call);

for i in 1..1500 loop

ch:=lpad('o',32767,'Y');

dbms_lob.writeappend(clb,length(ch),ch);

end loop;

k:=dbms_lob.getlength(clb);

dbms_lob.freetemporary(clb);

dbms_output.put_line('the clob length: '||k);

end;

/

原文地址:https://www.cnblogs.com/kawashibara/p/10473703.html