标签:
第一个区的第一个块就称为段头(SEGMENT HEADE),段头中就储存了一些信息,基中HWM的信息就存储在此。此时,因为第一个区的第一块用于存储段头的一些信息,虽然没有存储任何实际的记录,但也算是被使用,此时HWM是位于第2个块当我们不断插入数据到PM_USER后,第1个块已经放不下后面新插入的数据,此时,ORACLE将高水位之上的块用于存储新增数据。
在向表里插入数据后,HWM本身也向上移.也就是说,当我们不断插入数据时,HWM会往不断上移,这样,在HWM之下的,就表示使用过的块,HWM之上的就表示已分配但从未使用过的块。
当对表进行导出,导入后,或者move等操作后,HWM就会降低到真实水平上。自动段管理(ASSM)在自动段管理(ASSM)中,利用位图来代替空闲列表,当会话向表插入数据时,数据库只格式一个单独的位图块,而不是像MSSM中那样,会预先格式化一组块。
在ASSM表空间中,除了一个HWM外,还有一个低HWM。在MSSM中,HWM推进时,所有的块都会格式化并立即生效,这样Oracle 就可以安全的读取这些块。但是对于ASSM,当HWM推进时,Oracle 并不会立即格式所有的块,只是在第一次使用的时候才会对这些块进行格式化。也就是说,在第一次使用的的时候,即进行insert 操作时,数据会插入到块中的任意水位线,位于低水位线(LHMW)和高水位线(HHMW)之间。因此在这个区域的许多块就不会被格式化。在一个ASSM段中的每个数据块可能为这些状态:◎ 在HWM之上这些块都是没有格式化,且没有被使用◎在HWM之下这些块会处于这些状态之一:• 已经分配,但是没有被格式化且没有被使用• 已经格式化且包含数据• 已经格式化,但是已经删除数据,块为空下面来了解整个过程:
如图所示,在没进行数据插入前,段中的所有数据块都是没有格式化的且没有被使用。假设这个时候某会话将数据插入时,数据库会把数据写到任何可以利用的空间块中。如下图所示:
数据库也可能会选择HWM和低HWM之间的任何数据块,或者低HWM之下的任何可用的空间的块。注意低HWM位置,因为HWM之下的块只有在被使用的时候,才进行格式化,所以当存在数据扫描时,特别是全表扫描,Oracle 会读取到低HWM的位置。如下图所示:
如果某条会话将数据插入到某表中,但是在当前的HWM之下没有足够的可用空间,那么这个时候Oracle 会推进HWM,重新分配一组新的没有格式化的块。当HWM与低HWM之间的位置被填满时,HWM会继续往前推进,而低HWM会相应的推进到旧的HWM位置中。以此类推,当数据库不断的插入数据,HWM会持续往前推移,而低HWM会尾随其后,除非重建、或缩小该对象等,否则HWM从不往回退。
新建一个表,然后存储分配较多的对象,
插入较多的数据,
现在来查询下全表扫描所花时间,
从该表的统计信息来看,该表公有15384个块,其中没有用到的块有0个,共有1003089行。现在来测试下delete对hwm的影响,
从统计信息来看,该表使用的块还是15384个块,但是空余块依然是0个,按道理来说,在delete 后,应该会有空余的块才对。其中,这里可以看出行数已经变为了0.从这里就可以验证了之前的说法,即HWM在插入数据时,当现有空间不足而进行空间的扩展时会向上移,但删除数据时不会往下移。这就会造成RACLE的全表扫描是读取ORACLE高水位标记下的所有BLOCK,也就是说,不管HWM下的BLOCK现在实际有没有存放数据,ORACLE都会一一读取,这样,在DELETE表后,ORACLE读了大量的空块,耗去了大量的时间测试环境没有show_space 这个过程,现在声明它:
那么这个就是HWM所有的BLOCK编号。
标签:
原文地址:http://www.cnblogs.com/zengkefu/p/5769226.html