前些天,同事说一张空表查询要花了大概40分钟,DELETE的时候也是,在一些Q群上问些有经验的人说可能是高位线的问题.
于是让他查下该表所占的空间有多大.如图:
一张空表居然占了184704个块,然后让他把那表TRUNCATE后,再查就只有8个块.这样就更加的肯定是高水位的原因.
一个块一般是8K,这样的话,这张空表就占了184704*8=1477632K=1443M.对1G多的空间进行全表扫描的话,可想而知需要花费的时间要很长.
下面是关于高水位的一些内容,参考:http://jolly10.itpub.net/post/7268/466758
一般ORACLE的逻辑存储有4个粒度,块,区,段,表空间.
其中,块是最小的存储单元.一般的块所占的空间一般是8K,但也有2K,4K,16K,32K这样配置,具体通过参数db_block_size来设置.
2)区:由一系列相邻的块而组成,这也是ORACLE空间分配的基本单位,举个例子来说,当我们创建一个表PM_USER时,首先ORACLE会分配一区的空间给这个表,随着不断的INSERT数据到PM_USER,原来的这个区容不下插入的数据时,ORACLE是以区为单位进行扩展的,也就是说再分配多少个区给PM_USER,而不是多少个块.
(3)段:是由一系列的区所组成,一般来说,当创建一个对象时(表,索引),就会分配一个段给这个对象.所以从某种意义上来说,段就是某种特定的数据.如CREATE TABLE PM_USER,这个段就是数据段,而CREATE INDEX ON PM_USER(NAME),ORACLE同样会分配一个段给这个索引,但这是一个索引段了.查询段的信息可以通过数据字典: SELECT * FROM USER_SEGMENTS来获得,
(4)表空间:包含段,区及块.表空间的数据物理上储存在其所在的数据文件中.一个数据库至少要有一个表空间.
OK,我们现在回到HWM上来,那么,什么是高水位标记呢?