攻略1-16 检测表中未使用的空间

问题描述

你在查询一张其中没有数据行的表,但返回这个为0的计数值还是花了几分钟的时间。根据经验,你知道这可能是由于表中有未使用的空间造成的。这里的想法是,表中最初有很多数据行,然后被删除掉了,在高水位线之下留下了很多未使用的空间。接下来的运算,例如全表扫描运算可能会需要很长的时间,因为Oracle要搜索最初有数据,但现在没有数据的数据块。因此,你需要确定表中是否有未使用的空间。

解决方案

可以通过查询DBA/ALL/USER_EXTENTS视图来检测表中是否存在高水位线问题。如果一张表分配有很多盘区,但其中并没有数据行,这就表明大量的数据被从这张表中删除了。例如:

enter image description here

如果数据块的数目更高,但数据行很少,则很有可能存在位于高水位线之下的空闲空间。

工作原理

Oracle将表的高水位线定义为段中已使用和未使用的空间之间的分界。在创建表的时候,Oracle会为表分配由MINEXTENTS表存储参数来定义的一定数量的盘区。每个盘区中都包含一定数量的数据块。在将数据插入表之前,没有数据块被占用,高水位线为0。随着盘区的分配以及数据不断插入表中,高水位线边界也会不断上升。DELETE语句并不会重置高水位线,从而在表中留下了未使用的空间。

你需要知道一些关于高水位线的,与性能相关的问题:

 SQL查询全表扫描; 
 直接路径加载空间使用率。 
在执行查询的时候,Oracle有时候需要扫描表的(高水位线以下的)每一个数据块,这被称为全表扫描。如果从一张表中删除了大量的数据,即使现在表中只有0行数据,全表扫描也会花很长时间。

并且,在进行直接路径加载的时候,Oracle会将数据插入到高水位线之上。很有可能就会在进行过数据删除和数据直接路径加载的表中留下大量未使用的空间。

除了“解决方案”部分的方法之外,还有其他一些方法可以检测高水位线之下未被使用的空间:

 自动追踪工具; 
 DBMS_SPACE包; 
 段顾问。 
关于使用追踪请参见攻略1-17,使用DBMS_SPACE包请参考攻略1-18。关于如何手工运行段顾问请参见攻略1-10。

目录