Chinaunix首页 | 论坛 | 博客
  • 博客访问: 582568
  • 博文数量: 57
  • 博客积分: 877
  • 博客等级: 准尉
  • 技术积分: 1275
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-24 16:16
文章分类

全部博文(57)

文章存档

2014年(2)

2013年(15)

2012年(20)

2011年(20)

我的朋友

分类: Oracle

2012-04-27 15:42:43

先按照tom的方法先搭建实验环境

1:建索引聚簇

2:再索引聚簇上建立索引

3:在索引聚簇上建立表

4:插入数据

点击(此处)折叠或打开

  1. SQL> create cluster emp_dept_cluster
  2.   2 (deptno number(2))
  3.   3 size 1024
  4.   4 /

  5. Cluster created.

  6. SQL> create index emp_dept_cluster_idx
  7.   2 on cluster emp_dept_cluster
  8.   3 /

  9. Index created.

  10. SQL> create table dept
  11.   2 (deptno number(2) primary key,
  12.   3 dname varchar2(14),
  13.   4 loc varchar2(13)
  14.   5 )
  15.   6 cluster emp_dept_cluster(deptno)
  16.   7 /

  17. Table created.

  18. SQL> create table emp
  19.   2 (empno number primary key,
  20.   3 ename varchar2(10),
  21.   4 job varchar2(9),
  22.   5 mgr number,
  23.   6 hiredate date,
  24.   7 sal number,
  25.   8 comm number,
  26.   9 deptno number(2) references dept(deptno)
  27.  10 )
  28.  11 cluster emp_dept_cluster(deptno)
  29.  12 /

  30. SQL> insert into dept
  31.   2 select * from scott.dept;

  32. 4 rows created.

  33. SQL> commit;

  34. SQL> insert into emp
  35.   2 select * from scott.emp;

  36. 14 rows created.

  37. SQL> commit;

现在实验环境已经建成,开始实验

1:查询数据是存放在那个数据块上面


 

点击(此处)折叠或打开

  1. SQL> select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from dept;

  2. DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
  3. ------------------------------------ ------------------------------------

  4.                                    6 29484
  5.                                    6 29484
  6.                                    6 29484
  7.                                    6 29484


  8. SQL> select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from emp;

  9. DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
  10. ------------------------------------ ------------------------------------

  11.                                    6 29484
  12.                                    6 29484
  13.                                    6 29484
  14.                                    6 29484
  15.                                    6 29484
  16.                                    6 29484
  17.                                    6 29484
  18.                                    6 29484
  19.                                    6 29484
  20.                                    6 29484
  21.                                    6 29484

  22. DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
  23. ------------------------------------ ------------------------------------

  24.                                    6 29484
  25.                                    6 29484
  26.                                    6 29484

  27. 14 rows selected.



 

从上面可以看到emp dept 表中的都是存放在 file 6 block 29484 这个数据块上面

2:转储该数据块

SQL> alter system dump datafile 6 block 29484;

 

System altered.

 

以下是转储的部分信息:


 

点击(此处)折叠或打开

  1. data_block_dump,data header at 0xa68664
  2. ===============
  3. tsiz: 0x1f98
  4. hsiz: 0x46
  5. pbl: 0x00a68664
  6. 76543210
  7. flag=--------
  8. ntab=3
  9. nrow=22
  10. frre=-1
  11. fsbo=0x46
  12. fseo=0x1cdb
  13. avsp=0x1c95
  14. tosp=0x1c95
  15. 0xe:pti[0] nrow=4 offs=0
  16. 0x12:pti[1] nrow=4 offs=4
  17. 0x16:pti[2] nrow=14 offs=8
  18. 0x1a:pri[0] offs=0x1f82
  19. 0x1c:pri[1] offs=0x1f54
  20. 0x1e:pri[2] offs=0x1f2a
  21. 0x20:pri[3] offs=0x1f02
  22. 0x22:pri[4] offs=0x1f6a
  23. 0x24:pri[5] offs=0x1f40
  24. 0x26:pri[6] offs=0x1f18
  25. 0x28:pri[7] offs=0x1eec
  26. 0x2a:pri[8] offs=0x1ec9
  27. 0x2c:pri[9] offs=0x1ea0
  28. 0x2e:pri[10] offs=0x1e77
  29. 0x30:pri[11] offs=0x1e51
  30. 0x32:pri[12] offs=0x1e26
  31. 0x34:pri[13] offs=0x1e00
  32. 0x36:pri[14] offs=0x1dda
  33. 0x38:pri[15] offs=0x1db5
  34. 0x3a:pri[16] offs=0x1d92
  35. 0x3c:pri[17] offs=0x1d69
  36. 0x3e:pri[18] offs=0x1d46
  37. 0x40:pri[19] offs=0x1d23
  38. 0x42:pri[20] offs=0x1cff
  39. 0x44:pri[21] offs=0x1cdb

从上面的信息里可以看到这里又3张表,22条数据,表02条数据,表14条数据,表214条数据

继续观察转储文件

block_row_dump:

tab 0, row 0, @0x1f82

tl: 22 fb: K-H-FL-- lb: 0x0  cc: 1

curc: 4 comc: 4 pk: 0x0180732c.0 nk: 0x0180732c.0

col  0: [ 2]  c1 0b

tab 0, row 1, @0x1f54

tl: 22 fb: K-H-FL-- lb: 0x0  cc: 1

curc: 6 comc: 6 pk: 0x0180732c.1 nk: 0x0180732c.1

col  0: [ 2]  c1 15

tab 0, row 2, @0x1f2a

tl: 22 fb: K-H-FL-- lb: 0x0  cc: 1

curc: 7 comc: 7 pk: 0x0180732c.2 nk: 0x0180732c.2

col  0: [ 2]  c1 1f

tab 0, row 3, @0x1f02

tl: 22 fb: K-H-FL-- lb: 0x0  cc: 1

curc: 1 comc: 1 pk: 0x0180732c.3 nk: 0x0180732c.3

col  0: [ 2]  c1 29

这是表0数据,其实表0就是我们最开始建立的索引聚簇(以deptno为聚簇键)

查询dept 表的deptno字段

点击(此处)折叠或打开

  1. SQL> select deptno from dept;

  2.     DEPTNO
  3. ----------

  4.         10
  5.         20
  6.         30
  7.         40

10,20,30,40 转换为16进制


 

点击(此处)折叠或打开

  1. SQL> select dump(&num,16) from dual;
  2. Enter value for num: 10
  3. old 1: select dump(&num,16) from dual
  4. new 1: select dump(10,16) from dual

  5. DUMP(10,16)
  6. -----------------

  7. Typ=2 Len=2: c1,b

  8. SQL> /;
  9. Enter value for num: 20
  10. old 1: select dump(&num,16) from dual
  11. new 1: select dump(20,16) from dual

  12. DUMP(20,16)
  13. ------------------

  14. Typ=2 Len=2: c1,15

  15. SQL> /;
  16. Enter value for num: 30
  17. old 1: select dump(&num,16) from dual
  18. new 1: select dump(30,16) from dual

  19. DUMP(30,16)
  20. ------------------

  21. Typ=2 Len=2: c1,1f

  22. SQL> /;
  23. Enter value for num: 40
  24. old 1: select dump(&num,16) from dual
  25. new 1: select dump(40,16) from dual

  26. DUMP(40,16)
  27. ------------------

  28. Typ=2 Len=2: c1,29

和转储文件中表0的字段值都相符合. 那这个索引聚簇中,表和聚簇键是通过什么相关联的呢,在表0中我看到了 pk: 0x0180732c.0 nk: 0x0180732c.0  pk: 0x0180732c.1 nk: 0x0180732c.1 pk: 0x0180732c.2 nk: 0x0180732c.2 pk: 0x0180732c.3 nk: 0x0180732c.3

为了能看的更直观一些我把表0一些重要信息囊括了一下:

   Deptno                   pk                    nk

10                  0x0180732c.0             0x0180732c.0

20                  0x0180732c.1             0x0180732c.1

30                  0x0180732c.2             0x0180732c.2

40                  0x0180732c.3             0x0180732c.3

 

其实下面的表1和表2就是通过pk中的最后那个值来相关联起来的,以下是表1的转储信息,我做了一些处理,就是还原了原来的信息:

点击(此处)折叠或打开

  1. tab 1, row 0, @0x1f6a
  2. tl: 24 fb: -CH-FL-- lb: 0x0 cc: 2 cki: 0 ----------------cki:0 和 0x0180732c.0 相关联
  3. col 0: [10] 41 43 43 4f 55 4e 54 49 4e 47 ---------------- ACCOUNTING
  4. col 1: [ 8] 4e 45 57 20 59 4f 52 4b ---------------- NEW YORK
  5. tab 1, row 1, @0x1f40
  6. tl: 20 fb: -CH-FL-- lb: 0x0 cc: 2 cki: 1 -------------------cki:1 和 0x0180732c.1 相关联
  7. col 0: [ 8] 52 45 53 45 41 52 43 48 ------------------ RESEARCH
  8. col 1: [ 6] 44 41 4c 4c 41 53 --------------------- DALLAS
  9. tab 1, row 2, @0x1f18
  10. tl: 18 fb: -CH-FL-- lb: 0x0 cc: 2 cki: 2 -----------------------cki:2 和 0x0180732c.2相关联
  11. col 0: [ 5] 53 41 4c 45 53 ------------------- SALES
  12. col 1: [ 7] 43 48 49 43 41 47 4f ------------------ CHICAGO
  13. tab 1, row 3, @0x1eec
  14. tl: 22 fb: -CH-FL-- lb: 0x0 cc: 2 cki: 3 -------------------------- cki:3 和 0x0180732c.3相关联
  15. col 0: [10] 4f 50 45 52 41 54 49 4f 4e 53 ------------ OPERATIONS
  16. col 1: [ 6] 42 4f 53 54 4f 4e ----

2其实也是一样的道理,这里就不写了!

 

还有这里的pknk 为什么一样呢,在什么时候会不一样呢

我刚才在创建的索引聚簇的时候 有个size=1024 这个字句,我猜想这个pknk 估计就是当 1024个字节放不下信息的时候,pknk起到指向要串连到其他的块的地址!

 

我们增加dept =10 的记录!

创建一个插入的存储过程


 

点击(此处)折叠或打开

  1. create or replace procedure insert_emp
  2. as
  3. begin
  4.    for i in 4000 .. 6000
  5.    loop
  6.     /*execute immediate '*/
  7.     insert into superman.emp values ( i,'aaaa','aaaaa',8000,sysdate,800,1000,10);
  8.      end loop;
  9.      end;
  10. SQL> exec insert_emp;

  11. PL/SQL procedure successfully completed

  12. SQL> commit;

  13. Commit complete

  14. SQL> alter sytem switch logfile;

  15. System altered

下面查看块的分布情况


 

点击(此处)折叠或打开

  1. SQL> select dbms_rowid.rowid_block_number(rowid) from superman.emp where deptno=10 GROUP BY dbms_rowid.rowid_block_number(rowid);

  2. DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
  3. ------------------------------------

  4.                                29516
  5.                                29483
  6.                                29519
  7.                                29484
  8.                                29512
  9.                                29487
  10.                                29513
  11.                                29485
  12.                                29518
  13.                                29517
  14.                                29486

  15. DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
  16. ------------------------------------

  17.                                29514

  18. 12 rows selected.

现在我们再次转储29484这个块

 

点击(此处)折叠或打开

  1. SQL> alter system dump datafile 6 block &blockid;
  2. Enter value for blockid: 29484
  3. old 1: alter system dump datafile 6 block &blockid
  4. new 1: alter system dump datafile 6 block 29484
  5. System altered.

block_row_dump:

tab 0, row 0, @0x1f82

tl: 22 fb: K-H-FL-- lb: 0x1  cc: 1

curc: 165 comc: 165 pk: 0x0180734d.0 nk: 0x01807349.0

col  0: [ 2]  c1 0b

 

0x0180734d file 6 block 29517

0x01807349 file 6 block 29513

 

这里我们可以得出 pk是指向它的上一块地址,nk是指向他的下一块地址!



 

 

 


 

阅读(1782) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~