用友股份-LE服务支持部技术方案--《oracle可用空间及水位线的查询及常用视图》建立日期:2013-01-01修改日期:xxxx-xx-xx文档属性:客户文控编号:LE-DY-JS-2013-00062/8文档控制创建记录审阅人姓名所属部门职位审阅签字发布人姓名所属部门发布时间日期作者所属部门邮件地址版本2013-01-01V1.03目录Oracle里常用的用于查询表空间.........................................................................4有关于水位线(HighWaterMark)的知识...............................................................74Oracle里常用的用于查询表空间Oracle里常用的用于查询表空间使用状况的视图如下:dba_data_files两个关键的列为bytes,maxbytes。Bytes指的是当前数据文件中已经被分配的空间,maxbytes指的是该数据文件最大可达的空间dba_free_space关键的列为bytes。指的是在当前数据文件中已经分配的空间里还可以使用的自由空间。dba_extents关键的列为blockid,指的是当前的数据文件中已使用的分区状况(根据blockid*block尺寸可以得到分区空间)。dba_segments关键的列为bytes。指的是当前segment在数据文件中占用的空间。dba_tablespace_usage_metric10g引入的一个比较直观的视图,其中关键的列是used_space和table_space,基本单位均为block。5这些表互相间的数值关系如下:以表空间为聚合计算对象:❶dba_data_files.bytes=dba_tablespace_usage_metric.used_space*block_size❷dba_data_files.maxbytes=dba_tablespace_usage_metric.table_space*block_size❸dba_free_space.bytes=dba_data_files.bytes-dba_segments.bytes❹dba_segments.bytes=dba_data_files.bytes-dba_free_space.bytes其中❶指在数据文件中已经分配可用的空间;❷指数据文件可达的最大空间(特别是针对可自动增长的数据文件);❸指在已分配可用的空间中还能自由使用的空间;❹指在已分配可用的空间中已使用的空间。延伸得到❶-❸/❶可得到当前已分配的空间中数据的空间占用率;❷-❶+❸可得到在磁盘空间充裕的情况下,当前数据库最大可用的空间.A综上可得关于表空间利用率,数据占用情况的查询语句如下:selecta.tablespace_name,round(a.bytes_alloc/1024/1024,2)megs_alloc,round(nvl(b.bytes_free,0)/1024/1024,2)megs_free,6round((a.bytes_alloc-nvl(b.bytes_free,0))/1024/1024,2)megs_used,round((nvl(b.bytes_free,0)/a.bytes_alloc)*100,2)Pct_Free,100-round((nvl(b.bytes_free,0)/a.bytes_alloc)*100,2)Pct_used,round(maxbytes/1048576,2)Maxfrom(selectf.tablespace_name,sum(f.bytes)bytes_alloc,sum(decode(f.autoextensible,'YES',f.maxbytes,'NO',f.bytes))maxbytesfromdba_data_filesfgroupbytablespace_name)a,(selectf.tablespace_name,sum(f.bytes)bytes_freefromdba_free_spacefgroupbytablespace_name)bwherea.tablespace_name=b.tablespace_name(+)unionallselecth.tablespace_name,round(sum(h.bytes_free+h.bytes_used)/1048576,2)megs_alloc,round(sum((h.bytes_free+h.bytes_used)-nvl(p.bytes_used,0))/1048576,2)megs_free,round(sum(nvl(p.bytes_used,0))/1048576,2)megs_used,round((sum((h.bytes_free+h.bytes_used)-nvl(p.bytes_used,0))/sum(h.bytes_used+h.bytes_free))*100,2)Pct_Free,100-round((sum((h.bytes_free+h.bytes_used)-nvl(p.bytes_used,0))/sum(h.bytes_used+h.bytes_free))*100,2)pct_used,round(f.maxbytes/1048576,2)maxfromsys.v_$TEMP_SPACE_HEADERh,sys.v_$Temp_extent_poolp,dba_temp_filesfwherep.file_id(+)=h.file_idandp.tablespace_name(+)=h.tablespace_nameandf.file_id=h.file_idandf.tablespace_name=h.tablespace_namegroupbyh.tablespace_name,f.maxbytesORDERBY1可得到TABLESPACE_NAMEMEGS_ALLOCMEGS_FREEMEGS_USEDPCT_FREEPCT_USEDMAX7表空间名称已分配空间已分配空间中的自由空间已用空间已分配空间中可用百分比占用百分比最大空间NNC_DATA0161501511.54638.524.5875.4232767.98有关于水位线(HighWaterMark)的知识所有的oracle段都有一个在段内容纳数据的上限,我们把这个上限称为"highwatermark"或HWM。这个HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment。HWM通常增长的幅度为一次5个数据块,原则上HWM只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值,由于这个特点,使HWM很象一个水库的历史最高水位,这也就是HWM的原始含义,当然不能说一个水库没水了,就说该水库的历史最高水位为0。但是如果我们在表上使用了truncate命令,则该表的HWM会被重新置为0。水位线会导致当表空间内的某些数据被删除后,表空间的占用不能释放。个别情况下当需要将自动增长的数据文件进行回缩时,需要知道水位线,才能进行安全的回缩操作。如何知道一个表的HWMselectfile_id,max(block_id+blocks-1)hwmfromdba_extentsgroupbyfile_id;此时可以用下列的语句和计算方法得到回缩数据文件的语句8alterdatabasedatafile‘xxxx’resizehwm*db_block_size/1024/1024mHWM对于性能的影响是因为它对全表扫描性能的影响。当实施一个全表扫描时,Oracle会读取所有HIGHWATERMARK下的块即使它们是空块。当HIGHWATERMARK下有很多unusedblock时实施全表扫描会增加额外的不必要的I/O。它也会在全局共享区中填充很多很多空块