【oracle】rowid转换rdba,rdba转换为file#block#



************************************************************************
  ****原文:blog.csdn.net/clark_xu 徐长亮的专栏
************************************************************************ 
-- 1 rowid和rdba的转换

--数据的存储属性rowid

--数据文件file#

--数据库对象obj#

--数据块号:block_no#

--表中行号

--物理rowid和逻辑rowid

--索引使用逻辑rowid

--其他类型使用物理rowid

--rowid伪列

select rowid,id,time from rangetable;

--因为rowid唯一标示一条记录,所以索引存储rowid值;通过索引中,找到rowid;

--新的base64编码。32bit obj#,10bit rfile#,22bit block#,16bit row#

--因此每个表空间最大1022个文件,每个数据文件最大4M=4000个block

--每个block中的行数最大65536行;

--通过dbms_rowid来转换rowid的信息

create or replace function get_rowid(l_rowid in varchar2)

return varchar2

is

ls_my_rowid varchar2(200);

rowid_type number;

object_number number;

relative_fno number;

block_number number;

row_number number;

begin

dbms_rowid.rowid_info(l_rowid,rowid_type,object_number,relative_fno,block_number,row_number);

ls_my_rowid:=‘Object# is :‘

||to_char(object_number)||chr(10)||

‘relative_fno is :‘

||to_char(relative_fno)||chr(10)||

‘block_number is :‘

||to_char(block_number)||chr(10)||

‘row number is :‘

||to_char(row_number)||chr(10);

return ls_my_rowid;

end;

select rowid,a.* from dept a;

select get_rowid(‘AAAMfNAAEAAAAAQAAA‘) row_id from dual;

2 RDBA转换为file#,block#

--转储system的表空间

alter session set events ‘immediate trace name FILE_HDRS level 10‘

--查看udummp文件dba地址

写了一个简单的函数,用来从RDBA中转换file#和block#出来:

CREATE OR REPLACE FUNCTION getbfno (p_dba IN VARCHAR2)

RETURN VARCHAR2

IS

l_str   VARCHAR2 (255) DEFAULT NULL;

l_fno   VARCHAR2 (15);

l_bno   VARCHAR2 (15);

BEGIN

l_fno :=

DBMS_UTILITY.data_block_address_file (TO_NUMBER(LTRIM (p_dba, ‘0x‘), ‘xxxxxxxx‘));

l_bno :=

DBMS_UTILITY.data_block_address_block (TO_NUMBER (LTRIM (p_dba, ‘0x‘), ‘xxxxxxxx‘));

l_str :=

‘datafile# is:‘

|| l_fno

|| CHR (10)

|| ‘datablock is:‘

|| l_bno

|| CHR (10)

|| ‘dump command:alter system dump datafile ‘

|| l_fno

|| ‘ block ‘

|| l_bno

|| ‘;‘;

RETURN l_str;

END;

select getbfno(‘0x00400179‘) bfno from dual;

************************************************************************
  ****原文:blog.csdn.net/clark_xu 徐长亮的专栏
************************************************************************ 
时间: 2024-08-24 13:07:04

【oracle】rowid转换rdba,rdba转换为file#block#的相关文章

js 图片转换base64 base64转换为file对象

function getImgToBase64(url,callback){//将图片转换为Base64 var canvas = document.createElement('canvas'), ctx = canvas.getContext('2d'), img = new Image; img.crossOrigin = 'Anonymous'; img.onload = function(){ canvas.height = img.height; canvas.width = img

js,JQ 图片转换base64 base64转换为file对象

//将图片转换为Base64 function getImgToBase64(url,callback){ var canvas = document.createElement('canvas'), ctx = canvas.getContext('2d'), img = new Image; img.crossOrigin = 'Anonymous'; img.onload = function(){ canvas.height = img.height; canvas.width = im

ORACLE rowid,file# 和 rfile#

rowid简介 rowid就是唯一标志记录物理位置的一个id,在oracle 8版本以前,rowid由file#+block#+row#组成,占用6个bytes的空间,10 bit 的 file# ,22bit 的 block# ,16 bit 的 row#. 从oracle 8开始rowid变成了extend rowid,由data_object_id#+rfile#+block#+row#组成,占用10个bytes的空间, 32bit的 data_object_id#,10 bit 的 rf

Oracle rowid

一.Rowid rowid是伪列(pseudocolumn),伪劣的意思是实际上这一列本身在数据字典中并不存在,在查询结果输出时它被构造出来的. rowid并不会真正存在于表的data block中,但是他会存在于index当中,用来通过rowid来寻找表中的行数据 二.Rowid的结构 限制rowid:用于早期Oracle版本(Oracle 8 以前),rowid由(10 bit)file#+(22 bit)block#+(16 bit)row#组成,占用6个bytes的空间 注:file#为

Oracle ROWID详解

1.ROWID定义 ROWID:数据库中行的全局唯一地址 对于数据中的每一行,rowid伪列返回行的地址.rowid值主要包含以下信息: 对象的数据对象编号 该行所在的数据文件中的数据块 该行中数据块的位置(第一行是0) 数据行所在的数据文件(第一个文件是1).该文件编号是相对于表空间. 通常来说,一个rowid值唯一标识数据中的一行.然而,存储在同一聚簇中不同的表可以有相同的rowid. 2.扩展ROWID 从Oracle 8i开始使用扩展rowid标识行物理地址 扩展rowid使用base6

Oracle ROWID具体解释

1.ROWID定义 ROWID:数据库中行的全局唯一地址 对于数据中的每一行,rowid伪列返回行的地址.rowid值主要包括下面信息: 对象的数据对象编号 该行所在的数据文件里的数据块 该行中数据块的位置(第一行是0) 数据行所在的数据文件(第一个文件是1).该文件编号是相对于表空间. 通常来说.一个rowid值唯一标识数据中的一行.然而,存储在同一聚簇中不同的表能够有同样的rowid. 2.扩展ROWID 从Oracle 8i開始使用扩展rowid标识行物理地址 扩展rowid使用base6

oracle查询转换_inlist转换

oracle的optimizer会对一些sql语句进行查询转换,比如: 合并视图 子查询非嵌套化 inlist转换 下面讲讲遇到的in list转化优化的案例: create table test( col1 varchar2(12) col2 number ext varchar2(4000) ); create index test_ind on test(user_id, col2); create sequence seq_test cache 200; 第一步:准备一些测试数据(10个

Oracle ROWID与UROWID

Oracle使用rowid数据类型存储行地址,rowid可以分成两种,分别适于不同的对像 Physical rowids:存储ordinary table,clustered table,table partition and subpartition,indexe,index partition and subpartition Logical rowids : 存储IOT的行地址 另一种rowid类型叫universal rowed(UROWID),支持上述physical rowid和lo

oracle查询转换_view merge

oracle对于子查询的支持做的很好,oracle optimizer会对inline view进行query transfomation,即视图合并,不过也经常带来意想不到的问题.下面是一个inline view的merge的例子: 1, 创建临时表 1 create table test1 as select * from dba_objects; 2 create table test2 as select * from dba_objects; 2, 以下查询语句 select * fr