千家信息网

临时表空间和临时段的研究

发表于:2024-10-09 作者:千家信息网编辑
千家信息网最后更新 2024年10月09日,对于临时表空间,主要用来做一些排序类的操作,oracle对于临时表空间采用的使用策略和其他的永久表空间的不同,当第一个使用临时表空间的排序操作开始,临时段被创建相应视图:SQL> select tab
千家信息网最后更新 2024年10月09日临时表空间和临时段的研究对于临时表空间,主要用来做一些排序类的操作,oracle对于临时表空间采用的使用策略和其他的永久表空间的不同,当第一个使用临时表空间的排序操作开始,临时段被创建相应视图:SQL> select table_name from dict where table_name like 'V$TEMP%';TABLE_NAME------------------------------V$TEMPFILEV$TEMPORARY_LOBSV$TEMPSEG_USAGEV$TEMPSTATV$TEMP_CACHE_TRANSFERV$TEMP_EXTENT_MAPV$TEMP_EXTENT_POOLV$TEMP_HISTOGRAMV$TEMP_PINGV$TEMP_SPACE_HEADERSQL> SELECT TABLE_NAME FROM DICT WHERE TABLE_NAME LIKE 'V$SORT%';TABLE_NAME------------------------------V$SORT_SEGMENTV$SORT_USAGE1、v$sysstat(查看数据库排序信息)SQL> select name,value from v$sysstat where name like 'sort%';NAME VALUE---------------------------------------------------------------- ----------sorts (memory) 3272sorts (disk) 0sorts (rows) 164422、v$sort_usage=v$tempseg_usage(查看临时表空间使用情况)SQL> select username,session_num from v$tempseg_usage;USERNAME SESSION_NUM------------------------------ -----------SYS 8SYS 8SYS 83、v$sort_segment(临时段中的extent管理)SQL> select TOTAL_EXTENTS,USED_EXTENTS,FREE_EXTENTS,ADDED_EXTENTS from v$sort_segment where tablespace_name='TEMP';TOTAL_EXTENTS USED_EXTENTS FREE_EXTENTS ADDED_EXTENTS------------- ------------ ------------ ------------- 902 0 902 898v$temp_space_header(该视图用来查询临时表空间使用情况)SQL> select tablespace_name,BYTES_USED,BYTES_FREE from v$temp_space_header;TABLESPACE_NAME BYTES_USED BYTES_FREE------------------------------ ---------- ----------TEMP 946864128 0
extent会被分配到这个临时段中,但当排序操作完成后,这个临时段并不会被删除掉,只会被oracle标记为Free从而使其他排序操作可以继续使用这个临时段,从这里我们也可以明白,对于一个临时表空间只能存在一个临时段。对于段中的extent管理通过v$sort_segment:SQL> select TOTAL_EXTENTS,USED_EXTENTS,FREE_EXTENTS,ADDED_EXTENTS from v$sort_segment where tablespace_name='TEMP';TOTAL_EXTENTS USED_EXTENTS FREE_EXTENTS ADDED_EXTENTS------------- ------------ ------------ ------------- 117 117 0 6571当我们数据库中temp表空间不在被会话所使用,相应的临时段就会释放。extent被标记为FreeTOTAL_EXTENTS USED_EXTENTS FREE_EXTENTS ADDED_EXTENTS------------- ------------ ------------ ------------- 364 0 364 6818从上面可知,一但开始使用临时段,oracle就会分配对应的extent,不断往段中添加extent,而一但排序操作完成,oracle会立即释放使用的段,从而使段中的extent标记为Free.oracle的这一特性也使得oracle的临时表空间的数据文件将会越来越大,所以对于临时表空间我们也必须定期的观察并做维护。模拟临时表空间被大量消耗:(模拟一个排序操作)select * from dba_tab_columns a,dba_tab_columns b order by a.owner,b.table_name;运行一段时间后掐掉,此时发现对应oracle目录变大,临时表空间也变大。SQL> !df -kFilesystem 1K-blocks Used Available Use% Mounted on/dev/sda1 8254240 2244484 5590464 29% /none 403460 0 403460 0% /dev/shm/dev/sda2 10317860 6550784 3242956 67% /oracleSQL> select username,session_num from v$sort_usage where tablespace='TEMP';USERNAME SESSION_NUM------------------------------ -----------SYS 8此时我们查找对应临时数据文件使用情况:SQL> select max(SEGBLK#) from v$sort_usage;MAX(SEGBLK#)------------ 9SQL> select 8*8192/1024/1024/1024 from dual;8*8192/1024/1024/1024--------------------- .000061035我们可以看到,虽然临时表空间很大,但是临时表空间的使用却不大,我们采用resize的方法缩小数据文件:SQL> alter database tempfile '/oracle/app/oradata/orcl/temp01.dbf' resize 100m;Database altered.SQL> !ls -l /oracle/app/oradata/orcl/temp01.dbf-rw-r----- 1 oracle dba 104865792数据文件已经缩小到100m减小临时表空间,释放磁盘空间的另一个方法是临时表空间的替换:创建temp:SQL> create temporary tablespace temp2 2 tempfile 'E:\XXXXXX\XXXXX\XXXX.dbf' size 100m autoextend on;确认原temp是否空闲:SQL> SELECT USERNAME,USER FROM V$SORT_USAGE WHERE TABLESPACE='TEMP'SQL> alter database default temporary tablespace TEMP2SQL> drop tablespace TEMP including contents and datafiles查看是否正确删除temp表空间。查看空间是否释放。
0