ITPub博客

首页 > 数据库 > Oracle > [20181226]简单探究cluster table.txt

[20181226]简单探究cluster table.txt

原创 Oracle 作者:lfree 时间:2018-12-26 11:13:50 0 删除 编辑

[20181226]简单探究cluster table.txt


--//简单探究cluster table.以前也做过,有点生疏了.


1.环境:

SCOTT@book> @ ver1

PORT_STRING         VERSION    BANNER

------------------- ---------- ----------------------------------------------------------------------------

x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production


2.建立测试环境:

create cluster deptx_cluster (deptno number(2));


create table deptx

(

  deptno  number(2) ,

  dname   varchar2(14 byte),

  loc     varchar2(13 byte)

) cluster deptx_cluster (deptno);


alter table deptx add constraint pk_deptx primary key (deptno);  


create table empx

(

  empno     number(4) ,

  ename     varchar2(10 byte),

  job       varchar2(9 byte),

  mgr       number(4),

  hiredate  date,

  sal       number(7,2),

  comm      number(7,2),

  deptno    number(2) references deptx

) cluster deptx_cluster (deptno);


alter table empx  add constraint constraint_name primary key (empno);  


create index i_deptx_cluster_deptno on cluster deptx_cluster;

--//注这里不能使用unique,否则报ORA-01715: UNIQUE may not be used with a cluster index


insert into deptx select * from dept where deptno=10;

insert into empx select * from emp where deptno=10;


insert into deptx select * from dept where deptno=20;

insert into empx select * from emp where deptno=20;


insert into deptx select * from dept where deptno=30;

insert into empx select * from emp where deptno=30;


insert into deptx select * from dept where deptno=40;

insert into empx select * from emp where deptno=40;


commit;


3.查看数据:

SCOTT@book> select rowid,deptx.* from deptx;

ROWID                  DEPTNO DNAME          LOC

------------------ ---------- -------------- -------------

AAAWEfAAEAAAAIrAAA         20 RESEARCH       DALLAS

~~~~~~~~~~~~~~~~~~

AAAWEfAAEAAAAItAAA         30 SALES          CHICAGO

AAAWEfAAEAAAAIuAAA         40 OPERATIONS     BOSTON

AAAWEfAAEAAAAIvAAA         10 ACCOUNTING     NEW YORK


SCOTT@book> select rowid,empx.* from empx where deptno=20;

ROWID                   EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO

------------------ ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

AAAWEfAAEAAAAIrAAA       7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20

~~~~~~~~~~~~~~~~~~

AAAWEfAAEAAAAIrAAB       7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975                    20

AAAWEfAAEAAAAIrAAC       7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

AAAWEfAAEAAAAIrAAD       7876 ADAMS      CLERK           7788 1987-05-23 00:00:00       1100                    20

AAAWEfAAEAAAAIrAAE       7902 FORD       ANALYST         7566 1981-12-03 00:00:00       3000                    20


SCOTT@book> @ dpc '' ''

PLAN_TABLE_OUTPUT

-------------------------------------

SQL_ID  fw7tmp1r74rf4, child number 0

-------------------------------------

select rowid,empx.* from empx where deptno=20

Plan hash value: 1833007843

------------------------------------------------------------------------------------------------

| Id  | Operation            | Name                   | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |

------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT     |                        |        |       |     2 (100)|          |

|   1 |  TABLE ACCESS CLUSTER| EMPX                   |      5 |   190 |     2   (0)| 00:00:01 |

|*  2 |   INDEX UNIQUE SCAN  | I_DEPTX_CLUSTER_DEPTNO |      1 |       |     1   (0)| 00:00:01 |

------------------------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):

-------------------------------------------------------------

   1 - SEL$1 / EMPX@SEL$1

   2 - SEL$1 / EMPX@SEL$1

Predicate Information (identified by operation id):

---------------------------------------------------

   2 - access("DEPTNO"=20)


--//可以发现查询empx表的deptno=20可以利用cluster table的索引.另外你可以注意一个特点cluster table里面的表rowid可以相同.比如下划线的内容.

--//实际上这样设计相关表的查询都保存在相同块中,连接访问会快许多.


SCOTT@book> @ rowid AAAWEfAAEAAAAIrAAA

    OBJECT       FILE      BLOCK        ROW ROWID_DBA            DBA                  TEXT

---------- ---------- ---------- ---------- -------------------- -------------------- ----------------------------------------

     90399          4        555          0  0x100022B           4,555                alter system dump datafile 4 block 555 ;

--//转储dba=4,555看看.


3.转储分析:

SCOTT@book> alter system flush buffer_cache;

System altered.


SCOTT@book> alter system dump datafile 4 block 555 ;

System altered.


Block header dump:  0x0100022b

 Object id on Block? Y

 seg/obj: 0x1611f  csc: 0x03.175f42b6  itc: 2  flg: E  typ: 1 - DATA

     brn: 0  bdba: 0x1000228 ver: 0x01 opc: 0

     inc: 0  exflg: 0


 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

0x01   0x0009.01b.00000a44  0x00c00356.0394.31  C---    0  scn 0x0003.175f42b6

0x02   0x000a.001.00004cfa  0x00c02e94.0ef9.27  --U-    6  fsc 0x0000.175f42cc

bdba: 0x0100022b

data_block_dump,data header at 0x7f286b5f1064

===============

tsiz: 0x1f98

hsiz: 0x28

pbl: 0x7f286b5f1064

     76543210

flag=-------K

ntab=3

nrow=7

frre=-1

fsbo=0x28

fseo=0x1eb9

avsp=0x1e91

tosp=0x1e91

0xe:pti[0]  nrow=1  offs=0

0x12:pti[1] nrow=1  offs=1

0x16:pti[2] nrow=5  offs=2

--//说明有3个表,cluster表deptx_cluster以及表deptx,empx.行数分别是1,1,5(下面可以看到对于7条记录).后面offs表示偏移量.

0x1a:pri[0] offs=0x1f82

0x1c:pri[1] offs=0x1f6e

0x1e:pri[2] offs=0x1f4b

0x20:pri[3] offs=0x1f25

0x22:pri[4] offs=0x1f00

0x24:pri[5] offs=0x1edd

0x26:pri[6] offs=0x1eb9

block_row_dump:

tab 0, row 0, @0x1f82                               --//表0 cluster table deptx_cluster

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

--//fb: K-H-FL--, K meaning cluster key.

--//The remaining rows have the second high order bit set (fb: -CH-FL--),

--//C meaning cluster table member.

curc: 6 comc: 6 pk: 0x0100022b.0 nk: 0x0100022b.0

--//curc: 6 Current row count for this key in this block

--//comc: 6 Committed row count for this key in this block

--//pk: pk: 0x0100022b.0 ROWID of Previous block for this cluster key

--//nk: 0x0100022b.0 ROWID of Next block for this cluster key

col  0: [ 2]  c1 15                                 --//数字20.

tab 1, row 0, @0x1f6e

tl: 20 fb: -CH-FL-- lb: 0x2  cc: 2 cki: 0           --//表1 deptx

                                                    --//C meaning cluster table member.

col  0: [ 8]  52 45 53 45 41 52 43 48               --//对应内容'RESEARCH'

col  1: [ 6]  44 41 4c 4c 41 53                     --//对应内容'DALLAS'

tab 2, row 0, @0x1f4b                               --//表2 empx

tl: 35 fb: -CH-FL-- lb: 0x2  cc: 6 cki: 0

col  0: [ 3]  c2 4a 46

col  1: [ 5]  53 4d 49 54 48

col  2: [ 5]  43 4c 45 52 4b

col  3: [ 3]  c2 50 03

col  4: [ 7]  77 b4 0c 11 01 01 01

col  5: [ 2]  c2 09

tab 2, row 1, @0x1f25

tl: 38 fb: -CH-FL-- lb: 0x2  cc: 6 cki: 0

col  0: [ 3]  c2 4c 43

col  1: [ 5]  4a 4f 4e 45 53

col  2: [ 7]  4d 41 4e 41 47 45 52

col  3: [ 3]  c2 4f 28

col  4: [ 7]  77 b5 04 02 01 01 01

col  5: [ 3]  c2 1e 4c

tab 2, row 2, @0x1f00

tl: 37 fb: -CH-FL-- lb: 0x2  cc: 6 cki: 0

col  0: [ 3]  c2 4e 59

col  1: [ 5]  53 43 4f 54 54

col  2: [ 7]  41 4e 41 4c 59 53 54

col  3: [ 3]  c2 4c 43

col  4: [ 7]  77 bb 04 13 01 01 01

col  5: [ 2]  c2 1f

tab 2, row 3, @0x1edd

tl: 35 fb: -CH-FL-- lb: 0x2  cc: 6 cki: 0

col  0: [ 3]  c2 4f 4d

col  1: [ 5]  41 44 41 4d 53

col  2: [ 5]  43 4c 45 52 4b

col  3: [ 3]  c2 4e 59

col  4: [ 7]  77 bb 05 17 01 01 01

col  5: [ 2]  c2 0c

tab 2, row 4, @0x1eb9

tl: 36 fb: -CH-FL-- lb: 0x2  cc: 6 cki: 0

col  0: [ 3]  c2 50 03

col  1: [ 4]  46 4f 52 44

col  2: [ 7]  41 4e 41 4c 59 53 54

col  3: [ 3]  c2 4c 43

col  4: [ 7]  77 b5 0c 03 01 01 01

col  5: [ 2]  c2 1f

end_of_block_dump

End dump data blocks tsn: 4 file#: 4 minblk 555 maxblk 555


--//通过bbed观察:

BBED> p dba 4,555 kdbt

struct kdbt[0], 4 bytes                     @114

   sb2 kdbtoffs                             @114      0

   sb2 kdbtnrow                             @116      1

struct kdbt[1], 4 bytes                     @118

   sb2 kdbtoffs                             @118      1

   sb2 kdbtnrow                             @120      1

struct kdbt[2], 4 bytes                     @122

   sb2 kdbtoffs                             @122      2

   sb2 kdbtnrow                             @124      5


--//与如下对应:

0xe:pti[0]  nrow=1  offs=0

0x12:pti[1] nrow=1  offs=1

0x16:pti[2] nrow=5  offs=2


--//比如可以看出对于当前块表empx位于*kdbr[2]开始.


BBED> x /rn *kdbr[0]

rowdata[201]                                @8166

------------

flag@8166: 0xac (KDRHFL, KDRHFF, KDRHFH, KDRHFK)       --//cluster key.行头为ac 普通表为2c

lock@8167: 0x00

cols@8168:    1

kref@8169:    6

mref@8171:    6

hrid@8173:0x0100022b.0

nrid@8179:0x0100022b.0

col    0[2] @8185: 20


BBED> x /rcc *kdbr[1]

rowdata[181]                                @8146

------------

flag@8146: 0x6c (KDRHFL, KDRHFF, KDRHFH, KDRHFC)      --//cluser table member .行头为6c 删除为7c,实际上加入KDRHFD标志.

lock@8147: 0x02

cols@8148:    2

col    0[8] @8150: RESEARCH

col    1[6] @8159: DALLAS

--//注:不包括cluster table key.


BBED> x /rnccntnnn *kdbr[2]

rowdata[146]                                @8111

------------

flag@8111: 0x6c (KDRHFL, KDRHFF, KDRHFH, KDRHFC)

lock@8112: 0x02

cols@8113:    6

col    0[3] @8115: 7369

col    1[5] @8119: SMITH

col    2[5] @8125: CLERK

col    3[3] @8131: 7902

col    4[7] @8135: 1980-12-17 00:00:00

col    5[2] @8143: 800


4.做一个删除的手工恢复看看.


SCOTT@book> delete from empx where empno=7566;

1 row deleted.


SCOTT@book> commit ;

Commit complete.


SCOTT@book> alter system flush buffer_cache;

System altered.


SCOTT@book> alter system dump datafile 4 block 555 ;

System altered.


--//仅仅贴出改动部分:

block_row_dump:

tab 0, row 0, @0x1f82

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

curc: 6 comc: 5 pk: 0x0100022b.0 nk: 0x0100022b.0

col  0: [ 2]  c1 15

--//comc 5 少1条记录.


...


tl: 35 fb: -CH-FL-- lb: 0x0  cc: 6 cki: 0

col  0: [ 3]  c2 4a 46

col  1: [ 5]  53 4d 49 54 48

col  2: [ 5]  43 4c 45 52 4b

col  3: [ 3]  c2 50 03

col  4: [ 7]  77 b4 0c 11 01 01 01

col  5: [ 2]  c2 09

tab 2, row 1, @0x1f25

tl: 4 fb: -CHDFL-- lb: 0x2  cc: 0 cki: 0  --//加入D标志.

tab 2, row 2, @0x1f00


--//如果手工修复,需要修改2处.


BBED> x /rn *kdbr[0]

rowdata[201]                                @8166

------------

flag@8166: 0xac (KDRHFL, KDRHFF, KDRHFH, KDRHFK)

lock@8167: 0x00

cols@8168:    1

kref@8169:    6

mref@8171:    5

~~~~~~~~~~~~~~~

hrid@8173:0x0100022b.0

nrid@8179:0x0100022b.0

col    0[2] @8185: 20


BBED> x /rnccntnnn *kdbr[3]

rowdata[108]                                @8073

------------

flag@8073: 0x7c (KDRHFL, KDRHFF, KDRHFD, KDRHFH, KDRHFC)

lock@8074: 0x02

cols@8075:    0


--//执行如下:

assign /d offset 8171=6;

assign /x offset 8073=6c;


BBED> assign /d offset 8171=6;

Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y

ub1 rowdata[0]                              @8171     0x06


BBED> assign /x offset 8073=6c;

ub1 rowdata[0]                              @8073     0x6c


--//检查:

BBED> x /rn *kdbr[0]

rowdata[201]                                @8166

------------

flag@8166: 0xac (KDRHFL, KDRHFF, KDRHFH, KDRHFK)

lock@8167: 0x00

cols@8168:    1

kref@8169:    6

mref@8171:    6

hrid@8173:0x0100022b.0

nrid@8179:0x0100022b.0

col    0[2] @8185: 20


BBED> x /rnccntnnn *kdbr[2]

rowdata[146]                                @8111

------------

flag@8111: 0x6c (KDRHFL, KDRHFF, KDRHFH, KDRHFC)

lock@8112: 0x00

cols@8113:    6


col    0[3] @8115: 7369

col    1[5] @8119: SMITH

col    2[5] @8125: CLERK

col    3[3] @8131: 7902

col    4[7] @8135: 1980-12-17 00:00:00

col    5[2] @8143: 800


BBED> sum apply

Check value for File 4, Block 555:

current = 0xf209, required = 0xf209


BBED> verify

DBVERIFY - Verification starting

FILE = /mnt/ramdisk/book/users01.dbf

BLOCK = 555


Block Checking: DBA = 16777771, Block Type = KTB-managed data block

data header at 0x7fd6f1fd9264

kdbchk: the amount of space used is not equal to block size

        used=263 fsc=34 avsp=7825 dtl=8088

Block 555 failed with check code 6110

--//空间问题暂时不理会.

--//验证修改是否有效.

SCOTT@book> select rowid,empx.* from empx where deptno=20;

ROWID                   EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO

------------------ ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

AAAWEfAAEAAAAIrAAA       7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20

AAAWEfAAEAAAAIrAAB       7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975                    20

AAAWEfAAEAAAAIrAAC       7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

AAAWEfAAEAAAAIrAAD       7876 ADAMS      CLERK           7788 1987-05-23 00:00:00       1100                    20

AAAWEfAAEAAAAIrAAE       7902 FORD       ANALYST         7566 1981-12-03 00:00:00       3000                    20

--//empno=7566可以查询到.如果通过索引是无法查询到信息.

SCOTT@book> select rowid,empx.* from empx where empno=7566;

no rows selected


--//如果不修复comc的偏移,还原:

BBED> assign /d offset 8171=5;

ub1 rowdata[0]                              @8171     0x05


BBED> sum apply

Check value for File 4, Block 555:

current = 0xf109, required = 0xf109


BBED> verify

DBVERIFY - Verification starting

FILE = /mnt/ramdisk/book/users01.dbf

BLOCK = 555


Block Checking: DBA = 16777771, Block Type = KTB-managed data block

data header at 0x105cc64

kdbchk:  key comref count wrong

         keyslot=0

Block 555 failed with check code 6121


--//会报如上错误.不过查询没有问题.


SCOTT@book> alter system flush buffer_cache;

System altered.


SCOTT@book> select rowid,empx.* from empx where deptno=20;

ROWID                   EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO

------------------ ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

AAAWEfAAEAAAAIrAAA       7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20

AAAWEfAAEAAAAIrAAB       7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975                    20

AAAWEfAAEAAAAIrAAC       7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

AAAWEfAAEAAAAIrAAD       7876 ADAMS      CLERK           7788 1987-05-23 00:00:00       1100                    20

AAAWEfAAEAAAAIrAAE       7902 FORD       ANALYST         7566 1981-12-03 00:00:00       3000                    20


5.最后修复bbed verify的错误.

--//这个错误我建议不熟悉bbed,不再修复,比较繁琐.


BBED> assign /d offset 8171=6;

ub1 rowdata[0]                              @8171     0x06


BBED> sum apply

Check value for File 4, Block 555:

current = 0xf209, required = 0xf209


BBED> verify

DBVERIFY - Verification starting

FILE = /mnt/ramdisk/book/users01.dbf

BLOCK = 555


Block Checking: DBA = 16777771, Block Type = KTB-managed data block

data header at 0x105cc64

kdbchk: the amount of space used is not equal to block size

        used=263 fsc=34 avsp=7825 dtl=8088

Block 555 failed with check code 6110


--//理论used+fsc+avsp=dtl

--//dtl-used-fsc= 8088-263-34 = 7791

--//然后assign kdbh.kdbhavsp=7791,如果修改事务itl槽信息,步骤也不少.


BBED> assign kdbh.kdbhavsp=7791

sb2 kdbhavsp                                @110      7791


BBED> sum apply

Check value for File 4, Block 555:

current = 0xf2f7, required = 0xf2f7


BBED> verify

DBVERIFY - Verification starting

FILE = /mnt/ramdisk/book/users01.dbf

BLOCK = 555


Block Checking: DBA = 16777771, Block Type = KTB-managed data block

data header at 0x107ec64

kdbchk: space available on commit is incorrect

        tosp=7863 fsc=34 stb=0 avsp=7791

Block 555 failed with check code 6111


--//tosp - fsc - stb = avsp.

--//avsp+fsstb=  7791+34+0 = 7825.


BBED> assign kdbh.kdbhtosp=7825

sb2 kdbhtosp                                @112      7825


BBED> sum apply

Check value for File 4, Block 555:

current = 0xf2d1, required = 0xf2d1


BBED> verify

DBVERIFY - Verification starting

FILE = /mnt/ramdisk/book/users01.dbf

BLOCK = 555

DBVERIFY - Verification complete

Total Blocks Examined         : 1

Total Blocks Processed (Data) : 1

Total Blocks Failing   (Data) : 0

Total Blocks Processed (Index): 0

Total Blocks Failing   (Index): 0

Total Blocks Empty            : 0

Total Blocks Marked Corrupt   : 0

Total Blocks Influx           : 0

Message 531 not found;  product=RDBMS; facility=BBED


6.修复索引:

SCOTT@book> alter index pk_empx rebuild online;

Index altered.

--//注意一定要加online,不然不回表,无法修复错误索引错误.


SCOTT@book> select rowid,empx.* from empx where empno=7566;

ROWID                   EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO

------------------ ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

AAAWEfAAEAAAAIrAAB       7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975                    20


总结:

--//修复cluster table要比普通表有难度.


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/267265/viewspace-2286463/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    2669
  • 访问量
    6427069