ITPub博客

首页 > 数据库 > 数据库开发技术 > 临时表空间的探讨案例

临时表空间的探讨案例

原创 数据库开发技术 作者:shiyihai 时间:2007-02-28 11:38:22 0 删除 编辑


对于dba来讲,涉及临时表空间的字典表和动态视图有如下:
v$tempfile;v$tablespace;v$tempstat;dba_temp_files;dba_free_space,v$temp_space_header
V$TEMP_SPACE_HEADER:显示每一个临时表空间中每一个文件的聚集信息,涉及每个空间首部中当前
使用多少空间和有多少自由空间.

分三个方面来进行阐述:
1.怎样来查看临时表空间的剩余空间.
9i的话,可以采用如下的查询语句:
SQL> SELECT D.TABLESPACE_NAME,SPACE "SUM_SPACE(M)",BLOCKS SUM_BLOCKS,USED_SPACE "USED_SPACE(M)",
2 ROUND(NVL(USED_SPACE,0)/SPACE*100,2) "USED_RATE(%)",NVL(FREE_SPACE,0) "FREE_SPACE(M)"
3 FROM (SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/(1024*1024),2) SPACE,SUM(BLOCKS) BLOCKS
4 FROM DBA_TEMP_FILES
5 GROUP BY TABLESPACE_NAME) D,
6 (SELECT TABLESPACE_NAME,ROUND(SUM(BYTES_USED)/(1024*1024),2) USED_SPACE,
7 ROUND(SUM(BYTES_FREE)/(1024*1024),2) FREE_SPACE
8 FROM V$TEMP_SPACE_HEADER
9 GROUP BY TABLESPACE_NAME) F
10 WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+);

TABLESPACE_NAME SUM_SPACE(M) SUM_BLOCKS USED_SPACE(M) USED_RATE(%) FREE_SPACE(M)
------------------------------ ------------ ---------- ------------- ------------ -------------
TEMP 3550 454400 2527 71.18 1023

或
SQL> select total_blocks,used_blocks,free_blocks from v$sort_segment;

TOTAL_BLOCKS USED_BLOCKS FREE_BLOCKS
------------ ----------- -----------
323200 384 322816

SQL>
8i的话可采用如下的查询:

SELECT UPPER(F.TABLESPACE_NAME) "表空间名",
D.TOT_GROOTTE_MB "表空间大小(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,
2),
'990.99') "使用比",
F.TOTAL_BYTES "空闲空间(M)",
F.MAX_BYTES "最大块(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER BY 4 DESC;

可看出9i中dba_free_space中是没有temp表空间的信息的,临时表空间是单独管理的.

2.重建临时表空间对应的文件
C:Documents and Settingsshiyihai>sqlplus /nolog

SQL*Plus: Release 9.2.0.6.0 - Production on 星期二 2月 27 16:16:31 2007

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

SQL> conn /as sysdba
已连接到空闲例程。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area 135864308 bytes
Fixed Size 454644 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 1191936 bytes
数据库装载完毕。
数据库已经打开。
SQL> select file_name,tablespace_name from dba_temp_files;

FILE_NAME
--------------------------------------------------------------------------------
TABLESPACE_NAME
------------------------------
C:ORACLEORADATAORA9ITEMP01.DBF
TEMP
SQL> alter database tempfile 'C:ORACLEORADATAORA9ITEMP01.DBF' drop including datafiles;

数据库已更改。

SQL> select file_name,tablespace_name,file_id from dba_temp_files;

未选定行

SQL> alter tablespace temp add tempfile 'C:ORACLEORADATAORA9ITEMP01.DBF' size 20M reuse;

表空间已更改。
SQL> select file_name,tablespace_name,file_id from dba_temp_files;

FILE_NAME
--------------------------------------------------------------------------------
TABLESPACE_NAME FILE_ID
------------------------------ ----------
C:ORACLEORADATAORA9ITEMP01.DBF
TEMP 1


SQL>

3.临时表空间为何暴涨?
我们知道Oracle临时表空间主要是用来做查询和存放一些缓存的数据的,磁盘消耗的一个主要原因是需要对查询的结果进行排序,如果没有猜错的话,在磁盘空间的(内存)的分配上,Oracle使用的是贪心算法,如果上次磁盘空间消耗达到1GB,那么临时表空间就是1GB,如果还有增长,那么依此类推,临时表空间始终保持在一个最大的上限。总归原因有如下几点:
1). 没有为临时表空间设置上限,而是允许无限增长。但是如果设置了一个上限,最后可能还是会面临因为空间不够而出错的问题,临时表空间设置太小会影响性能,临时表空间过大同样会影响性能,至于需要设置为多大需要仔细的测试。
2.查询的时候连表查询中使用的表过多造成的。我们知道在连表查询的时候,根据查询的字段和表的个数会生成一个迪斯卡尔积,这个迪斯卡尔积的大小就是一次查询需要的临时空间的大小,如果查询的字段过多和数据过大,那么就会消耗非常大的临时表空间。
3.对查询的某些字段没有建立索引。Oracle中,如果表没有索引,那么会将所有的数据都复制到临时表空间,而如果有索引的话,一般只是将索引的数据复制到临时表空间中。

[@more@]

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/38542/viewspace-900805/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    235
  • 访问量
    1707874