ITPub博客

首页 > Linux操作系统 > Linux操作系统 > index and rowid

index and rowid

原创 Linux操作系统 作者:tolilong 时间:2012-07-01 20:05:03 0 删除 编辑
1.rowid

AAAMiS         AAE          AAAABA            AAA

Data object      relative file       block number         row number

Number         number

 

 

A-Z    0-25

a-z     26-51

0-9     52-61

+       62

/       63

 

select 12*64*64+34*64+20 from dual

select dbms_rowid.rowid_object(rowid),

dbms_rowid.rowid_relative_fno(rowid),

dbms_rowid.rowid_block_number(rowid),

dbms_rowid.rowid_row_number(rowid)

from scott.tt

 

18位的64进制值在数据库内却是以10bytes合计80bit的二进制数存放的

一个oracle数据库中最多可以有power(2,32)个对象,即4G个对象;3位的相对文件号在数据库中是用10位二进制来存放的,也就
意味着一个表空间中最多可以容纳power(2,10)=1024去掉全0和全1个数据文件,即1022个数据文件;6位的数据块号用22位二进制来存放
的,也就意味着一个数据文件最多可以包含power(2,22)=4M个数据块;3位的行号在数据库中是用16位二进制来存放的,也就意味着一个
数据块上最多可以容纳power(2,16)=65536行记录。

         查看信息。

        select rowid,dbms_rowid.rowid_object(rowid) object_id,dbms_rowid.rowid_relative_fno(rowid) file_id,

 dbms_rowid.rowid_block_number(rowid) block_id,  dbms_rowid.rowid_row_number(rowid) row_id,empno from emp;  

        dba_objects object_id可能data_object_id会不一样,object_id是唯一的数据对象标志,data_object_id会随着truncate segment有所改变。

a.Cluster rowid 可能会重复

    首先要创建cluster,创建cluster之后必须要为cluster创建索引

 

            创建以后可以查看其中的有相同的rowid

            对于普通的Heap Table,我们说rowid的确可以精确定位到表里的记录,并且任何两张表中得rowid绝对不会重复。

     对于Cluster Table就不一样了,完全有可能会出现rowid重复的情况。

    

 

 

b.大文件中表空间的rowid

    创建大文件表空间

 


    其中文件号都是0.

 


         
对于大文件表空间下的rowid有如下特定的格式,这有别于小文件表空间下的rowid格式:OOOOOOBBBBBBBBBRRR
即,6位的数据库对象号+9位的数据块号+3位的行号,同样也是以18位的64进制值来表示80位的二进制数。

只不过,在这里少了相对文件号,其中6位的数据库对象号用32位的二进制数来存放(即一个数据库最多可以拥有232=4G个数据块对象)

9位的数据块号同样用32位的二进制数来存放(即一个大文件表空间可以拥有232个数据块儿)

最后3位的行号占用剩余的16位的二进制数,正好占满80位。

        最后,我们就可以很容易理解为什么本实验中bigfile_tab表的相对文件号为0了?因为该表的rowid格式中
根本就不存在相对文件号的信息,最本质的原因是大文件表空间下永远只能有且仅有1个数据文件,也就没有相对文件号的概念了。
同时,我们也可以推算出为什么官方文档中说,对于大文件的表空间,如果数据块大小为32K的话,那么这个表空间的上限是128Tb

因为大文件表空间下最多可以有232个数据块,那么该表空间大小=232*32K=237K=227M=217G=27T=128T

 

 

 

 

 

 

2.object_id,data_object_id

Object_id:对象id

Data_object_id:id,和物理存放位置有关系

段一定是对象,对象不一定是段

Create table的时候object_id,data_object_id一样

SQL> select object_id,data_object_id from user_objects where object_name='TT'

  2  ;

 

 OBJECT_ID DATA_OBJECT_ID

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

     51346          51346

移动表

SQL> alter table tt move tablespace test;

 

已更改表格.

数据段发生了变化。Truncate也会使数据段发生变化

SQL> select object_id,data_object_id from user_objects where object_name='TT';

 

 OBJECT_ID DATA_OBJECT_ID

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

     51346          51347

 

发现如上object_id没有变,data_object_id发生了变化。

 

 

 

SQL> truncate table tt;

 

表格被截斷.

 

SQL> select object_id,data_object_id from user_objects where object_name='TT';

 

 OBJECT_ID DATA_OBJECT_ID

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

     51346          51348

 

一样如上object_id没有变,data_object_id发生了变化。

 

 

 

3. alter tablespace test offline 不能查询表,

但是可以删除。因为删除表为更新元数据。

SQL> alter tablespace test offline;

 

已更改表格空間.

 

SQL> select * from scott.tt;

select * from scott.tt

                    *

 ERROR 在行 1:

ORA-00376: 無法於此時讀取檔案 5

ORA-01110: 資料檔 5: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\TEST.DBF'

 

 

SQL> drop table tt;

drop table tt

           *

 ERROR 在行 1:

ORA-00942: 表格或視觀表不存在

 

 

SQL> drop table scott.tt;

 

已刪除表格.

 

SQL> flashback table scott.tt to before drop;

 

完成倒溯.

 

SQL> alter tablespace test online;

 

已更改表格空間.

 

 

 

 

4. file_id,relative_fno

File_iddatabase中唯一 1…65535(绝对文件编号)

Relative_fnotablespace中唯一 1..1024(相对文件编号)

 

 

 

 

 

 

5.index   àb-tree(oltp),bitmap(olap)

SQL> select object_Id from USER_objects where object_name='TT1_INDEX'

  2  ;

 

 OBJECT_ID

----------

     51350

 

SQL> alter session set events 'immediate trace name treedump level 51350';

 

已更改階段作業.

user_dump_dest中,查看数据。

branch: 0x10000bc 16777404 (0: nrow: 91, level: 1)

   leaf: 0x10000bd 16777405 (-1: nrow: 479 rrow: 479)

   leaf: 0x10000be 16777406 (0: nrow: 479 rrow: 479)

   leaf: 0x10000bf 16777407 (1: nrow: 479 rrow: 479)

   leaf: 0x10000c0 16777408 (2: nrow: 479 rrow: 479)

   leaf: 0x10000c1 16777409 (3: nrow: 479 rrow: 479)

   leaf: 0x10000c2 16777410 (4: nrow: 479 rrow: 479)

   leaf: 0x10000c3 16777411 (5: nrow: 479 rrow: 479)

   leaf: 0x10000c4 16777412 (6: nrow: 479 rrow: 479)

   leaf: 0x10000c5 16777413 (7: nrow: 479 rrow: 479)

   leaf: 0x10000c6 16777414 (8: nrow: 449 rrow: 449)

   leaf: 0x10000cb 16777419 (12: nrow: 449 rrow: 449)

   leaf: 0x10000cc 16777420 (13: nrow: 449 rrow: 449)

  ………………………………….

   leaf: 0x100031d 16778013 (89: nrow: 13 rrow: 13)

----- end tree dump

 

SQL> select to_number('10000bd','xxxxxxx') from dual;

 

TO_NUMBER('10000BD','XXXXXXX')

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

                      16777405

 

 

查询数据得出数据文件号和块文件号

SQL> select dbms_utility.data_block_address_file(16777405) from dual

  2  ;

 

DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(16777405)

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

                                             4

 

SQL> select dbms_utility.data_block_address_block(16777405) from dual;

 

DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(16777405)

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

                                            189

 

 

Dump出数据块的内容

SQL> select * from v$mystat where rownum=1;

 

       SID STATISTIC#      VALUE

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

       147          0          1

 

SQL> select paddr from v$session where sid=147;

 

PADDR

--------

33A4E3BC

 

SQL> select spid from v$process where addr='33A4E3BC'

  2  ;

 

SPID

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

4276

 

SQL> alter system dump datafile 4 block 189;

 

已更改系統.

Dump出来的结果如下(摘取了部分)

eaf block dump

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

header address 153821796=0x92b2264

kdxcolev 0

KDXCOLEV Flags = - - -

kdxcolok 0

kdxcoopc 0x80: pcode=0: iot flags=--- is converted=Y

kdxconco 2

kdxcosdc 0

kdxconro 479

kdxcofbo 994=0x3e2

kdxcofeo 1813=0x715

kdxcoavs 819

kdxlespl 0

kdxlende 0

kdxlenxt 16777406=0x10000be

kdxleprv 0=0x0

kdxledsz 0

kdxlebksz 8036

row#0[8023] flag: ------, lock: 0, len=13

col 0; len 3; (3):  c2 03 3b                          

col 1; len 6; (6):  01 00 00 3c 00 00                   rowid

row#1[8010] flag: ------, lock: 0, len=13

col 0; len 3; (3):  c2 03 3c

col 1; len 6; (6):  01 00 00 3c 00 01

row#2[7997] flag: ------, lock: 0, len=13

col 0; len 3; (3):  c2 04 0c

col 1; len 6; (6):  01 00 00 3c 00 02

row#3[7984] flag: ------, lock: 0, len=13

col 0; len 3; (3):  c2 04 0e

col 1; len 6; (6):  01 00 00 3c 00 03

row#4[7971] flag: ------, lock: 0, len=13

col 0; len 3; (3):  c2 04 0f

col 1; len 6; (6):  01 00 00 3c 00 04

row#5[7958] flag: ------, lock: 0, len=13

col 0; len 3; (3):  c2 04 11

col 1; len 6; (6):  01 00 00 3c 00 05

row#6[7945] flag: ------, lock: 0, len=13

上面着色的部分,第一行为row的值,第二部分为rowid

第一部分:

SQL> select dump(258,16) from dual;

 

DUMP(258,16)

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

Typ=2 Len=3: c2,3,3b

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

第二部分:

01 00 00 3c 00 00                à16进制,转换为2进制

00000001  00000000  00000000  00111100  00000000  00000000   à2进制

 

AAAMiVAAEAAAAA8AAA

00000001  00                   à 4             文件编号

000000  00000000  00111100     à60             编号

00000000  00000000             à0              行号

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

SQL> select object_id,rowid,

  2  dbms_rowid.rowid_relative_fno(rowid) fno,

  3  dbms_rowid.rowid_block_number(rowid) bno,

  4  dbms_rowid.rowid_row_number(rowid) rowno from scott.tt1 where object_Id=258  ;

 

 OBJECT_ID ROWID                     FNO        BNO     ROWNO

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

258     AAAMiVAAEAAAAA8AAA          4         60          0

上面两部分得出来的结果一样。

 

 

6.index hint

SQL> select /*+ index(tt1 tt1_index)*/ * from tt1 where object_id=999;

SQL> select /*+dynamic_sampling(0)*/ * from tt1 where object_id=999;

 

 

 

select * from dba_tables where table_name='TT1'

select * from dba_indexes where index_name='TT1_INDEX'

select * from dba_tab_histograms where wner='SCOTT' and table_name='TT1'             à柱状图

 

SQL> exec dbms_stats.gather_table_stats('scott','tt1',estimate_percent=>100)

 

 

 

7.index扫描方法

1).index range scan            

2).index fast full scan

3).Index full scan=table full scan

4).index skip scan                   组合索引中

1.jpg

2.jpg

1.jpg

2.jpg

3.jpg

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

请登录后发表评论 登录
全部评论

注册时间:2010-07-13

  • 博文量
    406
  • 访问量
    958796