oracleBLOCK(数据块)

发布时间:2020-08-15 20:58:04 作者:波仔strong
来源:ITPUB博客 阅读:185

11.4 BLOCK(数据块)


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_tablesAVG_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物化视图的表。

推荐阅读:
  1. Django 如何配置nginx
  2. C# 利用Selenium实现浏览器自动化操作的方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

oracleblock 数据 数据块

上一篇:SQL基本语句

下一篇:社交电商能解决这三个难题,你才能抓住社交电商的红利期

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》