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进制值在数据库内却是以10个bytes合计80个bit的二进制数存放的
一个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_id在database中唯一 1…65535(绝对文件编号)
Relative_fno在tablespace中唯一 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 组合索引中
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24237320/viewspace-734256/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24237320/viewspace-734256/