|
|
|
|
移动端

5.4.3 数据段信息(DBA_SEGMENTS)(1)

《循序渐进Oracle:数据库管理、优化与备份恢复》第5章表空间和数据文件,本章将为大家介绍一下表空间的原理知识及管理维护。本节为大家介绍数据段信息(DBA_SEGMENTS)。

作者:盖国强来源:人民邮电出版社|2011-08-30 22:35

有奖调研 | 1TB硬盘等你拿 AI+区块链的发展趋势及应用调研


5.4.3  数据段信息(DBA_SEGMENTS)(1)

段(Segment)是Oracle中数据对象的存在形式,可以通过DBA_SEGMENTS查询数据库中段的信息,这些信息包括对象名称、类型、所属表空间、空间使用等信息。下面通过一个简单的查询来统计不同表空间中对象的空间使用情况:

  1. SQL> select tablespace_name,count(*) nobjects,
    round(sum(bytes)/1024/1204/1024,2) GB,  
  2.   2  sum(blocks),sum(extents) from dba_segments  
  3.   3  group by rollup(tablespace_name);  
  4. TABLESPA   NOBJECTS      GB SUM(BLOCKS) SUM(EXTENTS)  
  5. -------- ---------- ------- ----------- ------------  
  6. BOSSMGR        1208  169.70     6538080        40863  
  7. DBMON             7     .00          44            8  
  8. SYSAUX         3162     .79       30344         4723  
  9. SYSTEM         1255     .70       26842         2613  
  10. UNDOTBS1         10     .04        1352           40  
  11. USERS             4     .01         212           23  
  12.                5646  171.22     6596874        48270  
  13.  
  14. 7 rows selected. 

可以注意到,对于最大的一个表空间BOSSMGR,通过上一节的查询,这个表空间的数据文件占用了205GB的空间,而真正被使用的空间约为170GB。

这里引入一个新的概念:高水位标记(High Water Mark,HWM)。简单来说,对于以MSSM方式管理的Segment,HWM就是指这个Segment中已使用和未使用过的Block的分界线,HWM之上的空间在格式化之前不能被使用,即在HWM以上的数据块均为未格式化的块,这些未格式化的块在格式化之前是不能被insert数据的;在数据库事务中,当请求新的空闲块并且现有空闲列表(free list)中的块不能满足要求时,HWM将会向上移动,然后格式化一组数据块并加入Free List提供使用。在HWM之下的数据块也可能存在空闲情况,当数据被删除之后,数据块被释放重新回到空闲列表,又可以被其他数据变更所使用,HWM通常只会向上增长,不会自动收缩。

图5-8是一个数据段的HWM示意图,描述了HWM及空间使用的关系。

 
图5-8  一个数据段的HWM示意图

如果把图5-8扩展到一个数据文件上去,数据文件也存在一个类似的HWM概念,在HWM之上的空间是尚未分配给任何对象的,如果希望缩减数据文件的大小(通过Resize的方式),这个HWM就是数据文件能够收缩到的极限值。

回顾一下之前的数据文件转储信息,我们很容易在段头发现Highwater信息,这个信息就是HWM值:

  1. Extent Control Header  
  2.   --------------------------------------------
    ---------------------  
  3.   Extent Header:: spare1: 0      spare2: 0     
    #extents: 2      #blocks: 255  
  4.                   last map  0x00000000  #maps: 0 
    offset: 4128  
  5.       Highwater::  0x00c00056  ext#: 0      blk#: 76
    ext size: 127 

HWM会影响Oracle执行全表扫描时的读取行为,对于全表扫描操作,Oracle必须读取HWM下的所有数据块,如果一个数据表由于DELETE操作删除了大部分记录,但是HWM并不会降低,所以再次执行全表扫描时,Oracle仍然需要读取对象段中的所有数据块,这显然会影响性能,来看以下测试,创建一个测试表,并用autotrace跟踪全表扫描的数据读取:

  1. SQL> connect eygle/eygle  
  2. Connected.  
  3. SQL> create table test as select * from dba_objects;  
  4. Table created.  
  5. SQL> set autotrace trace stat  
  6. SQL> select count(*) from test;  
  7. Statistics  
  8. ----------------------------------------------------------  
  9.           0  recursive calls  
  10.           0  db block gets  
  11.          80  consistent gets  
  12.          77  physical reads 

删除数据,刷新Buffer,再次执行全表扫描查询:

  1. SQL> delete from test where rownum <2001;  
  2. 2000 rows deleted.  
  3. SQL> commit;  
  4. Commit complete.  
  5. SQL> alter session set events 'immediate trace name flush_cache level 1';  
  6. Session altered.  
  7. SQL> select count(*) from test;  
  8. Statistics  
  9. ----------------------------------------------------------  
  10.           0  recursive calls  
  11.           0  db block gets  
  12.          80  consistent gets  
  13.          78  physical reads 
【责任编辑:云霞 TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

J2ME手机游戏设计技术与实战

本书主要介绍了在手机上开发J2ME游戏的方法,作者在介绍了J2ME游戏开发相关知识背景的基础上,以大富翁手机游戏的设计开发为例,详细讲述了...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊