加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle ROWID解读

发布时间:2020-12-12 15:20:26 所属栏目:百科 来源:网络整理
导读:ROWID 是一个类似于rownum的伪列,用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即 被确定且唯一。而对于聚簇表,由于聚簇特性,不同表上的记录由于存储在相同的簇上,因此会拥有相同的ROWID。数据库的大多数

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] view plain copy print ?
  1. SQL>selectrowid,t.*fromdepttwheret.deptno=10;
  2. ROWIDDEPTNODNAMELOC
  3. -------------------------------------------------------
  4. AAAO0fAAFAAAAlmAAA10ACCOUNTINGNEWYORK/*
  5. AAAO0f-AAF-AAAAlm-AAA
  6. 对象号(6个字符)文件号(3个字符)块号(6个字符)行号(3个字符)*/

三、查看ROWID信息及相关演示
1、查看堆表上rowid及获取rowid信息

copy fromdept;-->查看表dept中所有记录的rowid
  • 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';-->查看对象id
  • OBJECT_NAMEOBJECT_ID
  • ------------------------------
  • DEPT60703
  • selectdbms_rowid.rowid_object(rowid)object_id,-->使用dbms_rowid包获得rowid的十进制信息
  • 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;-->通过文件id获得对象所在数据文件的位置
  • 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';-->列cluster_name上包含簇名,这两个表为簇表
  • 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-->查看emp上的rowid,存在与dept表相同的rowid
  • 2fromdeptdjoinempe
  • 3ond.rowid=e.rowid;
  • DEPTNOEMP_ROWIDENAME
  • --------------------------------------
  • 10AAAPRAAAsAABgDgAAACLARK
  • 20AAAPRAAAsAABgDgAABKING
  • 30AAAPRAAAsAABgDgAACMILLER
  • 40AAAPRAAAsAABgDgAADSMITH
  • select*fromdeptwhererowid='AAAPRAAAsAABgDgAAA';-->使用相同的rowid访问不同的表
  • DEPTNODNAMELOC
  • -------------------------------------
  • 10ACCOUNTINGNEWYORK
  • fromempEMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
  • ------------------------------------------------------------------------------
  • 7782CLARKMANAGER783909-JUN-81490010
  • 3、使用rowid访问数据的情形

    copy setautotraceon;
  • whererowid='AAAO0fAAFAAAAlmAAC';-->使用rowid访问数据行
  • 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-->此处的consistentgets值为1
  • 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-->consistentgets比直接使用rowid多一次(即执行了索引扫描)
  • 0physicalreads
  • 0redosize
  • 651bytessentviaSQL*Nettoclient
  • 492bytesreceivedviaSQL*Net2SQL*Netroundtrips0sorts(memory)
  • 0sorts(disk)
  • 1rowsprocessed
  • 4、使用rowid数据类型

    copy createtablet(idnumber,ridrowid);-->创建包含rowid类型的表
  • Tablecreated.
  • insertintot(id)values(1);-->新增一条记录
  • 1rowcreated.
  • updatetsetrid=t.rowid;-->更新rowid类型的列
  • 1rowupdated.
  • fromt;-->rid列于rowid列值相同
  • ROWIDIDRID
  • ----------------------------------------------
  • AAAPQ+AAFAAAAt4AAA1AAAPQ+AAFAAAAt4AAA
  • 5、rowid变化的情形

    copy altertabletmove;
  • Tablealtered.
  • -->使用altertabletab_namemove命令后,rowid发生变化
  • -->其他导致rowid变化的情形演示略
  • AAAPQ/AAFAAAAt8AAA1AAAPQ+AAFAAAAt4AAA
  • (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读