使用DUMP分析聚簇表的使用

来源:互联网 发布:淘宝商城名牌男装短袖 编辑:程序博客网 时间:2024/06/09 18:09
使用DUMP分析聚簇表的使用
 基本概念不聊了,从内部原理解析聚簇表的构成方式:
登录scott用户执行下列脚本创建聚簇表并插入数据
create cluster cl_deptno(DEPTNO number(2));


create table cl_dept(DEPTNO NUMBER(2) NOT NULL,DNAME VARCHAR2(14),LOC VARCHAR2(13)) cluster cl_deptno(deptno);


create table cl_emp(EMPNO NUMBER(4) NOT NULL,ENAME VARCHAR2(10),JOB VARCHAR2(9),MGR NUMBER(4),HIREDATE DATE,SAL NUMBER(7,2),COMM NUMBER(7,2),DEPTNO NUMBER(2)) cluster cl_deptno(deptno);


create index idx_cl_deptno on cluster cl_deptno;


select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from cl_dept;


insert into cl_dept select * from dept;


查看块的位置:


使用命令打印块结果:
 SQL> alter system dump datafile 4 block 323;
查看块内容:


可以发现ntab=2,nrow=2即该块存在两个表的数据,总共两行数据
tab 0 row 0的col 0 值为c1 1f即数字30,且tab 0的fb为K.....说明该表为聚簇表,即插入cl_dept表的deptno数据作为聚簇表数据存储在改块中
我们看下插入的数据:


继续解读,tab 1 row 0两个列,分别是5个字节和7个字节,都是16进制数据,转换成10进制用chr打印出来是SALES和CHICAGO
此段结束, 那为何没有第三个表的数据?原因很简单,第三个表没数据所以也没有关联到这个块的数据,也就只有两个表的数据。
继续实验:


插入数据库后查看下数据情况:


诸位看客是不是很期待看到dump出来的块是个什么样子?
这次我们dump 327 号块


查看块内容:


可以发现ntab=3,nrow=7即该块存在3个表的数据,总共7行数据


tab 0 row 0的col 0 值为c1 15即数字20,同样,tab 0的fb为K.....说明该表为聚簇表
tab 1 row 0的col 0 值为52 45 53 45 41 52 43 48,转换后为RESEARCH对应cl_dept表deptno=20,下面的col 1想必大家也猜到了吧,没错转换过来是DALLAS
tab 2 row 0的col 1 值为53 4d 49 54 48,转换后的值为:SMITH
tab 2 row 1的col 1 值为4a 4f 4e 45 53,转换后的值为:JONES
鉴于篇幅,后面的操作不贴了,有兴趣的同学可以做下这个实验
可以得出结论 无论是tab1和tab2,表上的聚簇列和聚簇表的聚簇列的值是一致的,即块在分配过程中根据聚簇列插入值分配数据块并同时插入符合条件的数据。因此在使用聚簇表的时候应该遵循两表使用聚簇列进行关联,且聚簇列数据不易频繁变化,因为该操作会导致数据迁移,表的dml操作不易过多,原因同样是会造成数据块过多的分配和迁移,相同聚簇列数据不宜过多,会造成块迁移,当然,相同聚簇列数据数据过少会导致空间浪费严重,如本例中的第一段中只有两个表两条数据却占用了一个数据块的8k空间。

1 0
原创粉丝点击