oracleBLOCK(数据块)

11.4 BLOCK(数据块)

创新互联建站专注于企业全网营销推广、网站重做改版、崂山网站定制设计、自适应品牌网站建设、H5高端网站建设商城建设、集团公司官网建设、外贸营销网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为崂山等各大城市提供网站开发制作服务。

11.4.1 BLOCK(数据块)的特点:

BLOCK是Oracle进行存储空间IO操作的最小单位,BLOCK的管理方法是区的管理和段管理的具体体现:

1、自动管理方式 如创建表空间时区为本地管理方式,并且将段的存储空间方式设置为AUTO(即ASSM),该表空间的所有块均采用位图自动管理方式。这是系统默认的。

2、空闲列表方式(MSSM) 引入FREELIST概念,以及PCTFREE和PCTUSED两个参数控制可用存储区的大小,避免行迁移现象的发生。这两个参数可在创建表空间时设置,也可在建立数据库的模式对象(表,索引)中设置。模式对象中设置的优先级比表空间的要高。就是说;如表和索引中没有设置,则按表空间的设置,如表空间也没设置,则按自动管理方式管理块。

data block :oracle 11g 标准块:8k,支持2-32k,有block header 、free space 、data 组成

数据块头部:

ITL:事务槽,可以有多个ITL以支持并发事务,每当一个事务要更新数据块里的数据时,必须先得到一个ITL槽,然后将当前事务ID,事务所用的undo数据块地址,SCN号,当前事务是否提交等信息写到ITL槽里。

initrans:初始化事务槽的个数,表默认1, index 默认为2;

maxtrans: 最大的事务槽个数 (默认255)

ROW DIR: 行目录, 指向空闲行起始和结束的偏移量。

考点:使块头增加的可能情况是,row entries增加,增加更多的ITL空间。

空闲列表方式的数据块的管理:

freelist:空闲列表中登记了可以插入数据的可用块,位置在段头,插入表行数据时首先查找该列表。

pctfree:用来为一个块保留的空间百分比,以防止在今后的更新操作中增加一列或多列值的长度。达到该值,从freelist清除该块信息。

pctused:一个块的使用水位的百分比,这个水位将使该块返回到可用列表中去等待更多的插入操作。达到该值,该块信息加入freelist

。这个参数在ASSM下不使用。

行链接:指一行存储在多个块中的情况,这是因为该行的长度超过了一个块的可用空间大小,即行链接是跨越多块的行。

行迁移:指一个数据行由于update语句导致当前块被重新定位到另一个块(那里有充足的空间)中,但在原始块中保留一个指针的情形(PPT-II-470)。原始块中的指针是必需的,因为索引的ROWID项仍然指向原始位置。行迁移是update语句当pctfree空间不足时引起的,它与insert和delete语句无关(考点)。

如何能够知道发生了行链接或行迁移?

查看dba_tables的AVG_ROW_LEN列和CHAIN_CNT列,当CHAIN_CNT有值时,看AVG_ROW_LEN,它表示行的平均长度(byte),如果AVG_ROW_LEN<块大小,那么行是迁移行,如果>块大小,那么是链接行。

查看发生迁移或连接的行,使用analyze table xx list chained rows; 但命令需要将结果插入chained_rows表,创建此表用utlchained.sql或utlchn1.sql脚本。参见sql referenve中的analyze命令。

SQL> create table t1 (c1 varchar2(20));

SQL>

begin

for i in 1..1000 loop

insert into t1 values(null);

end loop;

end;

/

分析t1表确定无行迁移

SQL> analyze table t1 compute statistics;

oracleBLOCK(数据块)SQL> select pct_free,pct_used,avg_row_len,chain_cnt from user_tables where table_name='T1';

AVG_ROW_LEN,它表示行的平均长度(byte)

填充这些空列,再分析t1,有了行迁移

SQL> update t1 set c1='timran is my drt';

SQL> analyze table t1 compute statistics;

SQL> select pct_free,pct_used,avg_row_len,chain_cnt from user_tables where table_name='T1';

oracleBLOCK(数据块)

move表,再分析t1,行迁移消失。 思考:段重组对于行链接有效吗?

SQL> alter table t1 move;

SQL> analyze table t1 compute statistics;

oracleBLOCK(数据块)SQL> select pct_free,pct_used,avg_row_len,chain_cnt,blocks from user_tables where table_name='T1';

考点:对于大部分目的而言,应该用DBMS_STATS包中的过程分析表,但要查看行链接或行迁移信息,只能通过ANALYZE命令检测。

11.4.2 表和数据块(block)的关系

1)什么是高水位线?

高水位线(high-water mark,HWM)

在数据库中,如果把表想象成从左到右依次排开的一系列块,高水位线就是曾经包含了数据的最右边的块。原则上HWM只会增大, 即使将表中的数据全部删除,HWM也不会降低。

HWM不是好事,使用全表扫描时通常要读出HWM以下的所有数据块(尽管该表中可能仅有少量数据),这将白白耗费大量IO资源。

2)两个解决办法可降低HWM:

2.1)移动表,move方法, 将表从一个表空间移动到另一个表空间(也可以在本表空间内move)。

语法:alter table t1 move [tablespace users];

优点:可以清除数据块中的碎片,降低高水位线。

缺点:move需要额外(一倍)的空间。

move过程中会锁表,其他用户不能在该表上做DML或DDL操作。

move之后,相关索引都不可用了,表上的索引需要重建(考点)。

2.2)收缩表,shrink 也叫段重组,表收缩的底层实现的是通过匹配的INSERT和DELETE操作。

它分两个不同的阶段:压缩阶段和降低HWM阶段。(PPT-II-491)

语法:alter table t2 shrink space [cascade][compact];

两个前提:1)表所在的表空间段管理是ASSM方式,因为位图方法才记录有关块实际的满度信息(考点)。2)表上启用了row movement。

你发出alter table t2 shrink space compact; 那么只完成了第一阶段。这是压缩阶段。在业务高峰时可以先完成第一阶段 delete insert

高峰过后,再次alter table t2 shrink space; 因压缩阶段工作大部分已完成,将很快进入第二阶段,DML操作会有短暂的锁等待发生。

测试:

create tablespace timran datafile '/u01/oradata/timran11g/timran01.dbf' size 100m;

create table scott.t2 tablespace timran as select * from dba_objects;

scott:

oracleBLOCK(数据块)select max(rownum) from t2;

select table_name, blocks, empty_blocks, num_rows from user_tables where table_name='T2';

analyze table t2 compute statistics;

delete t2 where rownum<=40000;

commit;

analyze table t2 compute statistics for table;

oracleBLOCK(数据块)select table_name, blocks, num_rows from user_tables where table_name='T2';

这时候,num_rows已经减掉了40000条, 但 blocks 并没有减少, 说明HWM没有下降。

做shrink

alter table t2 enable row movement; //使能行移动

进行第一步----压缩阶段

alter table t2 shrink space compact;

analyze table t2 compute statistics for table;

oracleBLOCK(数据块)select table_name, blocks, num_rows from user_tables where table_name='T2';        

//HWM不会降低。

进行第二步----降低HWM阶段

alter table t2 shrink space;

analyze table t2 compute statistics for table;

oracleBLOCK(数据块)select table_name, blocks, num_rows from user_tables where table_name='T2';     

//HWM已经降低。

考点:

1,表收缩操作生成undo和redo数据,索引可以得到维护。

2,收缩分为两个阶段 第一阶段是压缩阶段,第二阶段是降低HWM阶段。SHRINK不占用额外的空间。

3,可以单独完成第一阶段,即SHRINK SPACE COMPACT 此阶段不降低HWM,DML操作几乎不受影响。

4,可以级联相关的段一起收缩,即SHRINK SPACE CASCADE。

5,段必须ASSM管理方式,且使能行移动,否则不能收缩,如果不满足这两个前提,MOVE就是重组表的唯一方式。

6,不能收缩MSSM管理,或有LONG列表或是有refresh_on_commit物化视图的表。


当前标题:oracleBLOCK(数据块)
本文链接:http://scyanting.com/article/iiedhh.html