前端之家收集整理的这篇文章主要介绍了
Oracle ROWID,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
转自:http://blog.csdn.net/leshami/article/details/6931886
ROWID 是一个类似于rownum的伪列,用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即
被确定且唯一。而对于聚簇表,由于聚簇特性,不同表上的记录由于存储在相同的簇上,因此会拥有相同的ROWID。数据库的大多数操作都是通
过ROWID来完成的,而且使用ROWID来进行单记录定位速度是最快的。下面将给出ROWID的相关描述。
一、ROWID的特性组成及用途
1、特性
相对唯一性(聚簇表上不唯一)
一旦确定,不可随意更改
使用10个字节存储(扩展rowid),显示为18位的字符串
特殊情况下,ROWID会发生变化(如下列情形)
表的导入导出操作
alter table tab_name move
alter table tab_name shrink space
flashback table tab_name
拆分分区表
分区表上更新一个值后记录被移入到新分区
合并两个分区
2、组成(扩展ROWID)
数据库对象的对象编号
数据库对象所在文件的文件编号
数据库对象上块的编号
块上的行编号(起始值为0)
3、用途
快速定位单行记录
展示行在表上如何存储
表上的一行的唯一标识符
用作数据类型 column_name rowid
4、限制rowid,扩展rowid
限制rowid用于早期Oracle版本(Oracle 8 以前),rowid由file#+block#+row#组成,占用6个bytes的空间
扩展rowid,由data_object_id#+rfile#+block#+row#组成,占用10个bytes的空间
二、ROWID的格式
- sql>selectrowid,t.*fromdepttwheret.deptno=10;
-
- ROWIDDEPTNODNAMELOC
-
- AAAO0fAAFAAAAlmAAA10ACCOUNTINGNEWYORK/*
- AAAO0f-AAF-AAAAlm-AAA
- 对象号(6个字符)文件号(3个字符)块号(6个字符)行号(3个字符)*/
三、查看ROWID信息及相关演示
1、查看堆表上rowid及获取rowid信息
copy
fromdept;
AAAO0fAAFAAAAlmAAA10ACCOUNTINGNEWYORK
AAAO0fAAFAAAAlmAAB20RESEARCHDALLAS
AAAO0fAAFAAAAlmAAC30SALESCHICAGO
AAAO0fAAFAAAAlmAAD40OPERATIONSBOSTON
/**************************************************/
/*Author:RobinsonCheng*/
/*Blog:http://blog.csdn.net/robinson_0612*/
/*MSN:robinson_0612@hotmail.com*/
/*QQ:645746311*/
/**************************************************/
SQL>selectobject_name,object_idfromdba_objectswhereobject_name='DEPT'andowner='SCOTT';
OBJECT_NAMEOBJECT_ID
DEPT60703
selectdbms_rowid.rowid_object(rowid)object_id,
2dbms_rowid.rowid_relative_fno(rowid)file_id,
3dbms_rowid.rowid_block_number(rowid)block_id,
4dbms_rowid.rowid_row_number(rowid)num
5fromdept;
OBJECT_IDFILE_IDBLOCK_IDNUM
----------------------------------------
60703524060
60703524061
60703524062
60703524063
SQL>colfile_nameformata50
selectfile_id,file_namefromdba_data_fileswherefile_id=5;
FILE_IDFILE_NAME
------------------------------------------------------------
5/u02/database/CNMMBO/oradata/CNMMBO_system_tbl.dbf
-->这个查询按照rowid的定义格式进行分离rowid
2substr(rowid,1,6)"object",
3substr(rowid,7,3)"file",
4substr(rowid,10,6)"block",108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> 5substr(rowid,16,3)"row"
6fromdept;
ROWIDobjectfileblockrow
------------------------------------------------------------------------
AAAO0fAAFAAAAlmAAAAAAO0fAAFAAAAlmAAA
AAAO0fAAFAAAAlmAABAAAO0fAAFAAAAlmAAB
AAAO0fAAFAAAAlmAACAAAO0fAAFAAAAlmAAC
AAAO0fAAFAAAAlmAADAAAO0fAAFAAAAlmAAD
2、查看簇表上的rowid有关簇表请参考:簇表及簇表管理(Index clustered tables)
copy
selecttable_name,tablespace_name,cluster_name,status,pct_freefrom
2dba_tableswhereowner='ROBINSON';
TABLE_NAMETABLESPACE_NAMECLUSTER_NAMESTATUSPCT_FREE
---------------------------------------------------------------------------------
EMPTBS_TMPEMP_DEPT_CLUSTERVALID0
DEPTTBS_TMPEMP_DEPT_CLUSTERVALID0
SQL>selectrowiddept_rowid,deptno-->查看dept上的rowid
DEPT_ROWIDDEPTNO
----------------------------
AAAPRAAAsAABgDgAAA10
AAAPRAAAsAABgDgAAB20
AAAPRAAAsAABgDgAAC30
AAAPRAAAsAABgDgAAD40
selectd.deptno,e.rowidemp_rowid,e.ename
2fromdeptdjoinempe
3ond.rowid=e.rowid;
DEPTNOEMP_ROWIDENAME
--------------------------------------
10AAAPRAAAsAABgDgAAACLARK
20AAAPRAAAsAABgDgAABKING
30AAAPRAAAsAABgDgAACMILLER
40AAAPRAAAsAABgDgAADSMITH
select*fromdeptwhererowid='AAAPRAAAsAABgDgAAA';
DEPTNODNAMELOC
-------------------------------------
10ACCOUNTINGNEWYORK
fromemp EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
------------------------------------------------------------------------------
7782CLARKMANAGER783909-JUN-81490010
3、使用rowid访问数据的情形
copy
setautotraceon;
whererowid='AAAO0fAAFAAAAlmAAC';
DEPTNODNAMELOC
-------------------------------------
30SALESCHICAGO
ExecutionPlan
---------------------------------------------->执行计划中为TABLEACCESSBYUSERROWID访问方式
Planhashvalue:3453257278
-----------------------------------------------------------------------------------
|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|
|0|SELECTSTATEMENT||1|20|1(0)|00:00:01|
|1|TABLEACCESSBYUSERROWID|DEPT|1|20|1(0)|00:00:01|
-----------------------------------------------------------------------------------
Statistics
----------------------------------------------------------
0recursivecalls
0dbblockgets
1consistentgets
0physicalreads
0redosize
651bytessentviaSQL*Nettoclient
492bytesreceivedviaSQL*Netfromclient
2SQL*Netroundtripsto/fromclient
0sorts(memory)
0sorts(disk)
1rowsprocessed
wheredeptno=30;
--------------------------------------->执行计划先INDEXUNIQUESCAN,然后根据索引叶结点上的rowid访问数据
Planhashvalue:2852011669
---------------------------------------------------------------------------------------
BYINDEXROWID|DEPT|1|20|1(0)|00:00:01|
|*2|INDEXUNIQUESCAN|PK_DEPT|1||0(0)|00:00:01|
PredicateInformation(identifiedbyoperationid):
---------------------------------------------------
2-access("DEPTNO"=30)
Statistics
----------------------------------------------------------
1recursivecalls
0dbblockgets
2consistentgets
0physicalreads
0redosize
651bytessentviaSQL*Nettoclient
492bytesreceivedviaSQL*Net 2SQL*Netroundtrips 0sorts(memory)
0sorts(disk)
1rowsprocessed
4、使用rowid数据类型
copy
createtablet(idnumber,ridrowid);
Tablecreated.
insertintot(id)values(1);
1rowcreated.
updatetsetrid=t.rowid;
1rowupdated.
fromt;
ROWIDIDRID
----------------------------------------------
AAAPQ+AAFAAAAt4AAA1AAAPQ+AAFAAAAt4AAA
5、rowid变化的情形
copy
altertabletmove;
Tablealtered.
-->使用altertabletab_namemove命令后,rowid发生变化
-->其他导致rowid变化的情形演示略
AAAPQ/AAFAAAAt8AAA1AAAPQ+AAFAAAAt4AAA