文档章节

表访问方式---->通过ROWID访问表(table access by ROWID)

小强斋太
 小强斋太
发布于 2016/11/09 20:07
字数 979
阅读 6
收藏 0
点赞 0
评论 0

通过ROWID访问表(table access by ROWID)

       ROWID是一个伪列,即是一个非用户定义的列,而又实际存储于数据库之中。每一个表都有一个ROWID列,一个ROWID值用于唯一确定数据库表中的的一条记录。因此通过ROWID 方式来访问数据也是 Oracle 数据库访问数据的实现方式之一。一般情况下,ROWID方式的访问一定以索引访问或用户指定ROWID作为先决条件,因为所有的索引访问方式最终都会转换为通过ROWID来访问数据记录。(注:index full scan 与index fast full scan除外)由于Oracle ROWID能够直接定位一条记录,因此使用ROWID方式来访问数据,极大提高数据的访问效率

ROWID扫描是指Oracle在访问目标表里的数据时,直接通过数据所在的ROWID去定位并访问这些数据。

从严格意义上来说,Oracle中的ROWID扫描有两层含义:一种是根据用户在SQL语句中输入的ROWID的值直接去访问对应的数据行记录;另外一种是先去访问相关的索引,然后根据访问索引后得到的ROWID再回表去访问对应的数据行记录。

对Oracle中的堆表而言,我们可以通过Oracle内置的ROWID伪列得到对应行记录所在的ROWID的值(注意,这个ROWID只是一个伪 列,在实际的表块中并不存在该列),然后我们还可以通过DBMS_ROWID包中的相关方法(dbms_rowid.rowid_object,dbms_rowid.rowid_relative_fno、dbms_rowid.rowid_block_number和 dbms_rowid.rowid_row_number)将上述ROWID伪列的值翻译成对应数据行的实际物理存储地址。

参考:Oracle中的rowid

我们来看一个使用ROWID伪列和DBMS_ROWID包的实例。执行如下SQL,查询表EMP中的所有记录:

SCOTT@PDBORCL>  select empno, ename, rowid, dbms_rowid.rowid_object(rowid)||'_'||dbms_rowid.rowid_relative_fno(rowid) ||
 '_' || dbms_rowid.rowid_block_number(rowid) || '_' || dbms_rowid.rowid_row_number(rowid) location from emp;

     EMPNO ENAME      ROWID              LOCATION
---------- ---------- ------------------ -------------------------------------------------------------------------------
------------------------------------------------------------------------------------
      7369 SMITH      AAAWh/AAJAAAACVAAA 92287_9_149_0
      7499 ALLEN      AAAWh/AAJAAAACVAAB 92287_9_149_1
      7521 WARD       AAAWh/AAJAAAACVAAC 92287_9_149_2
      7566 JONES      AAAWh/AAJAAAACVAAD 92287_9_149_3
      7654 MARTIN     AAAWh/AAJAAAACVAAE 92287_9_149_4
      7698 BLAKE      AAAWh/AAJAAAACVAAF 92287_9_149_5
      7782 CLARK      AAAWh/AAJAAAACVAAG 92287_9_149_6
      7788 SCOTT      AAAWh/AAJAAAACVAAH 92287_9_149_7
      7839 KING       AAAWh/AAJAAAACVAAI 92287_9_149_8
      7844 TURNER     AAAWh/AAJAAAACVAAJ 92287_9_149_9
      7876 ADAMS      AAAWh/AAJAAAACVAAK 92287_9_149_10
      7900 JAMES      AAAWh/AAJAAAACVAAL 92287_9_149_11
      7902 FORD       AAAWh/AAJAAAACVAAM 92287_9_149_12
      7934 MILLER     AAAWh/AAJAAAACVAAN 92287_9_149_13

已选择 14 行。

SCOTT@PDBORCL>

从上述显示的内容中我们可以看出,EMPNO为7369的行记录所对应的ROWID伪列的值为"AAAWh/AAJAAAACVAAA",使用 DBMS_ROWID包对该伪列翻译后的值为"92287_9_149_0",这表示EMPNO为7369的行记录,对象编号为92287,实际的物理存储地址位于9号文件的第149个数据块的第0行记录(数据块里数据行记录的记录号从0开始算起)。

select file_name,file_id,relative_fno from dba_data_files where relative_fno=9;

SYS@PDBORCL> select file_name,file_id,relative_fno from dba_data_files where relative_fno=9;

FILE_NAME                                                                        FILE_ID     RELATIVE_FNO
-----------------------------------------------------------------------------------------------------------------------------------------------C:\APP\ORACLE\ORADATA\ORCL\PDBORCL\SAMPLE_SCHEMA_USERS01.DBF                         9            9

上述ROWID伪列的值是可以直接在SQL语句的where条件中使用的,这就是Oracle中ROWID扫描的两层含义中的第一种:根据用户在SQL语句中输入的ROWID的值直接去访问对应的数据行记录。

现在执行一次如下使用ROWID伪列的SQL:

SCOTT@PDBORCL> select empno,ename from emp where rowid='AAAWh/AAJAAAACVAAA';

     EMPNO ENAME
---------- ----------
      7369 SMITH

从上述显示的内容中我们可以看出,Oracle确实是通过ROWID伪列(即rowid='AAAWh/AAJAAAACVAAA')直接访问到了EMPNO为7369的行记录。

执行计划如下:

image

查询计划中说明该查询是的表访问方式是”TABLE ACCESS BY USER ROWID“,也就是直接通过USER ROWID来访问

参考:

Oracle中的rowid

ROWID扫描

Oracle ROWID 方式访问数据库

© 著作权归作者所有

共有 人打赏支持
小强斋太
粉丝 0
博文 181
码字总数 0
作品 0
广州
SQL优化常用方法42

使用提示(Hints) 对于表的访问,可以使用两种Hints. FULL 和 ROWID FULL hint 告诉ORACLE使用全表扫描的方式访问指定表. 例如: SELECT /+ FULL(EMP) / FROM EMP WHERE EMPNO = 7893; ROWID hi...

inzaghi1984 ⋅ 2017/12/17 ⋅ 0

ORACLE SQL性能优化系列 (一) black_snai

ORACLE SQL性能优化系列 (一) 原创 2003年07月21日 18:34:00 标签: oracle / sql / 性能优化 / 优化 / 数据库 / statistics <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:......

rootliu ⋅ 04/12 ⋅ 0

Oracle性能优化技巧

1.选用适合的ORACLE优化器 ORACLE的优化器共有3种: 1.RULE(基于规则) 2.COST(基于成本) 3.CHOOSE(选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZERMODE参数的各种声明,如RULE,CO...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

SQL优化常用方法26

索引的操作 ORACLE对索引有两种访问模式. 索引唯一扫描 ( INDEX UNIQUE SCAN) 大多数情况下, 优化器通过WHERE子句访问INDEX. 例如: 表LODGING有两个索引 : 建立在LODGING列上的唯一性索引LOD...

inzaghi1984 ⋅ 2017/12/15 ⋅ 0

FIRST_ROWS优化模式语言排序模糊匹配问题

标题比较长,不过只有这样才能把问题描述清楚。 问题详细描述为,在FIRST_ROWS优化模式下,将会话排序和比较方式设置为语义模式,即忽略大小写模式,对字段进行LIKE模糊查询,可能导致错误的...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

30个Oracle语句优化规则详解

选用适合的Oracle优化器 Oracle的优化器共有3种: a.RULE(基于规则) b.COST(基于成本) c.CHOOSE(选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZERMODE参数的各种声明,如RULE、...

markGao ⋅ 2014/05/28 ⋅ 0

Oracle语句优化30个规则详解

选用适合的Oracle优化器 Oracle的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZERMODE参数的各种声明,如...

风一样 ⋅ 2011/08/07 ⋅ 0

浅分析Oracle语句优化规则

今天博主说说关于Oracle语句优化问题,废话不多说直接上优化内容。希望对大家有所帮助。 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CH...

xiaole0313 ⋅ 2015/07/22 ⋅ 0

浅析Oracle语句优化规则

选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZERMODE参数的各种声明,如R...

benbenming ⋅ 2012/08/31 ⋅ 0

Oracle SQL 性能优化技巧

1.选用适合的ORACLE优化器  ORACLE的优化器共有3种 A、RULE (基于规则) b、COST (基于成本) c、CHOOSE (选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZERMODE参数的各种声明,...

ghostwl ⋅ 2014/12/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

笔试题之Java基础部分【简】【一】

基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法,其他 1.length、length()和size() length针对...

anlve ⋅ 21分钟前 ⋅ 1

table eg

user_id user_name full_name 1 zhangsan 张三 2 lisi 李四 `` ™ [========] 2018-06-18 09:42:06 星期一½ gdsgagagagdsgasgagadsgdasgagsa...

qwfys ⋅ 45分钟前 ⋅ 0

一个有趣的Java问题

先来看看源码: public class TestDemo { public static void main(String[] args) { Integer a = 10; Integer b = 20; swap(a, b); System.out......

linxyz ⋅ 50分钟前 ⋅ 0

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 今天 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 8

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部