SQL优化-同SQL不同执行计划-(CLOB详细分析2)

上篇:同SQL不同执行计划-CLOB详细分析1 

为了揭示问题本质,今天继续研究,大多数时候问题往往不是孤立存在得,上次简单的分析了数据的存储形式,今天更加深入的研究一下【块】在底层是如何组织很存储的。  

在Oracle中【块】是所有数据的基本组成单元,Oracle的块中保存着row piece,一个row piece可能是整个行,也可能是行的一部分或者指向行的指针。如果块中存储行的一部分,则该【块】称为【链式行】。如果【块】中存储的是行指针,则该块称为【迁移行】。
【块】包括一下几部分:
块首部
 表目录
行目录
空闲空间
行数据
块首部:包含与块有关的信息,如块地址及其所在段的类型。
表目录:包含与块内存储的表数据相关的信息。
行目录:包含块内存储的每个块或row piece的信息
空闲空间:数据空中尚可使用的空间。
行数据:块的大部分由表或索引数据组成,数据以row piece的形式存储在块中。
 
使用PCTUSED和PCTFREE这两参数来指定数据块的分配方式。
【迁移行】产生的原因
当数据被修改时,修改后的数据无法容纳在原块中,这行将会迁移到另一个数据块中,因为索引以来于行号或行在原行中的位置,所以必须维护相关的地址,为了维护这个地址,数据迁移到另一个块的时候,会将它的新地址的指针放在原来的位置,可以理解为一个地址转向,这种方法不用修改索引,但是读取数据的时候效率低。
 
【链式行】产生的原因
一行被插入到块中,但却容纳不下,则该块将分成多个row piece插入到不同的块中,这些row pieces就是链式行。
  
有了上述基本知识,我们可以很清楚的明白为什么有链式存在,就会为读取一条记录反复进行I/O操作,大大影响执行时间的原因。
【迁移行】和【链式行】不可避免,但是可以通过调整 PCTUSED PCTFREE 尽量减少
我们可以通过使用analyze命令查找这些行。
必须首先创建chained_rows表,创建的SQL语句在:
/u01/oracle/10g/rdbms/admin下的utlchain.sql中,执行它。
然后运行analyze命令:
---------------------------------------------------------------------
SQL> analyze
2      TABLE SCOTT.LOB_TABLE LIST CHAINED ROWS;
---------------------------------------------------------------------
查询记录不为空,则说明存在【链式行】或是【迁移行】。
当【链式行】或是【迁移行】存在的时候,大大增加了操作数据的I/O操作,就会出现前两天myepoch遇到的那些”奇怪”的问题,如:同SQL,数据量少时候反而比数据量大的执行不慢。我猜测myepoch上次的那个问题【同SQL不同执行计划】就有此类问题存在。
 
对于已经存在的【链式行】或【迁移行】,不能简单的把 CLOB 数据更新使其缩小,这样做不能解除问题,只能通过创建临时表,然后删除该行数据,再从临时表导入回来解决。
 
相信还存在其他原因,继续追查。相信能通过解决这个问题,自己也尽快提高,也给大家一个解决问题的参考:)
 
2008-5-17夜                      凌蓝风
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值