首页 > 数据库 > Oracle > 高水位线、行迁移行链接
高水位线
HWM是一个标记,用来说明已经有多少数据块分配给这个segment。DBA_TABLES.BLOCKS即HWM。HWM通常增长的幅度为一次5个数据块(11g开始默认一次性分配1M的block大小了,见create table storged的NEXT参数),原则上HWM只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值,由于这个特点,使HWM很象一个水库的历史最高水位,这也就是HWM的原始含义,当然不能说一个水库没水了,就说该水库的历史最高水位为0。但是如果我们在表上使用了truncate命令,则该表的HWM会被重新置为0。
a) 全表扫描通常要读出直到HWM标记的所有的属于该表数据库块,即使该表中没有任何数据。
b) 即使HWM以下有空闲的数据库块,键入在插入数据时使用了append关键字,则在插入时使用HWM以上的数据块,此时HWM会自动增大。如果插入数据时没有append关键字,则插入时会在HWM以内找空闲的块,这样HWM就不会增大
高水位线内的块分4种,一种是满了的块,一种没满的块,一种是extents扩展的空块,一种是删除数据后的空块
DBA_SEGMENTS.BLOCKS=DBA_TABLES.BLOCKS+ DBA_TABLES.EMPTY_BLOCKS
DBA_TABLES.BLOCKS代表该表中曾经使用过得数据库块的数目,即高水位线内的块。 DBA_TABLES.EMPTY_BLOCKS 代表分配给该表,但是在高水位线以上的数据库块。(This column is populated only if you collect statistics on the table using the DBMS_STATS package)因为每一次对表进行拓展都是以extent为单位的,所以会出现空数据块。
DBA_SEGMENTS.BLOCKS=DBA_TABLES.BLOCKS+ DBA_TABLES.EMPTY_BLOCKS
Delete操作的时候,dba_segments.Blocks、 user\dba_tables.Blocks、 user\dba_tables.empty_blocks三者都不会减小
insert /*+ append */ into XXX values(XXX);
使用append提示进行insert时系统不去查找freelist链表中的空闲块,直接在高水标记位以上插入数据,因此速度比较快。但若是对于经常delete的表,浪费磁盘空间太大。
行迁移(产生原因:update)
当某一行发生update操作时导致记录行长度有增加引发当前的数据不能在容纳在当前块,就会产生行迁移。行迁移时rowid不会改变,就是整行数据将会移动到新的块上,旧的块仅仅保留的是指向新块的地址信息,发生行迁移会对性能产生影响,因为读这条记录会读两个BLOCK。
行迁移和索引分裂的一些异同,可以互相理解
行链接(产生原因:insert)
当一行数据太大而不能在一个单数据块容纳时,行链接由此产生。举例来说,当你使用了4kb的Oracle 数据块大小,而你需要插入一行数据是8k, Oracle则需要使用3个数据块分成片来存储。因此,引起行链接的情形通常是,表上行记录的大小超出了数据库Oracle块的大小。行连接同样会影响性能,因为读一条记录至少会读两个BLOCK。
表上使用了LONG 或 LONG RAW数据类型的时候容易产生行链接。其次表上多于255列时Oracle会将这些过宽的表分片而产生行链接
查看行迁移或行链接的表
select * From dba_tables where nvl(chain_cnt,0)<>0
chain_cnt :Number of rows in the table that are chained from one data block to another or that have migrated to a new block, requiring a link to preserve the old rowid. This column is updated only after you analyze the table.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30126024/viewspace-2122477/ ,如需转载,请注明出处,否则将追究法律责任。