表访问方式---->通过ROWID访问表(table access by ROWID)
通过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伪列的值翻译成对应数据行的实际物理存储地址。
我们来看一个使用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的行记录。
执行计划如下:

查询计划中说明该查询是的表访问方式是”TABLE ACCESS BY USER ROWID“,也就是直接通过USER ROWID来访问
参考:
表访问方式---->通过ROWID访问表(table access by ROWID)的更多相关文章
- Sql Server中的表访问方式Table Scan, Index Scan, Index Seek
1.oracle中的表访问方式 在oracle中有表访问方式的说法,访问表中的数据主要通过三种方式进行访问: 全表扫描(full table scan),直接访问数据页,查找满足条件的数据 通过row ...
- 转:Sql Server中的表访问方式Table Scan, Index Scan, Index Seek
0.参考文献 Table Scan, Index Scan, Index Seek SQL SERVER – Index Seek vs. Index Scan – Diffefence and Us ...
- 表访问方式---->全表扫描(Full Table Scans, FTS)
全表扫描(Full Table Scans, FTS) 全表扫描是指Oracle在访问目标表里的数据时,会从该表所占用的第一个区(EXTENT)的第一个块(BLOCK)开始扫描,一直扫描到该表的高水位 ...
- Oracle 表的访问方式(1) ---全表扫描、通过ROWID访问表
1.Oracle访问表的方式 全表扫描.通过ROWID访问表.索引扫描 2.全表扫描(Full Table Scans, FTS) 为实现全表扫描,Oracle顺序地访问表中每条记录,并检查每一条记录 ...
- Oracle 表的访问方式(2)-----索引扫描
索引扫描(Index scan) 我们先通过index查找到数据对应的rowid值(对于非唯一索引可能返回多个rowid值),然后根据rowid直接从表中得到具体的数据,这种查找方式称为索引扫描或索引 ...
- Oracle 执行计划(二)------表访问的几种方式
表访问的几种方式:(非全部) 参照表 primary key is id 1.TABLE ACCESS FULL(全表扫描):查询出该表所有数据,获取的数据执行where语句. Don’t creat ...
- [20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED2.txt
[20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED2.txt --//简单探究12c TABLE ACCESS BY INDEX ROWID BATCH ...
- 看懂Oracle执行计划、表连接方式
看懂Oracle执行计划 原文:https://www.cnblogs.com/Dreamer-1/p/6076440.html 最近一直在跟Oracle打交道,从最初的一脸懵逼到现在的略有所知,也 ...
- oracle TABLE ACCESS BY INDEX ROWID 你不知道的索引回表-开发系列(三)
1 引言 近期系统常常提示一个sql查询时间过长的问题,看了一下就是一个每天依照时间戳统计前一天量的sql. 表总的数据量为53483065. 语句例如以下: select count(x.seria ...
随机推荐
- Visual Studio Code compile error - launch.json must be configured...
一.在最初使用VS Code创建控制台应用时, 使用VS Code调试工具默认会跑出异常: launch: program 'launch: launch.json must be configure ...
- float浮点数的四舍五入
瑞生网http://www.rationmcu.com版权所有 前几天,有个小伙伴在做实验过程中,发现了一个奇怪的现象,这个现象就是… 他在用printf输出浮点数的时候,想把数据保留到小数点后的两位 ...
- 使用Mobx插件查看mobx的变量值
mobx浏览器调试:可以知道store值.方法 在chrome上安装插件Mobx,可以查看store.history.match.location等内容
- 不用中间变量交换两个数 swap(a,b);
#include <iostream> using namespace std; int main () { ; ; cout<<"a="<<a ...
- 一个简易的WebServer程序
现在这个公司的it管理真不知道说什么了,我主要从事.net方向的开发,公司电脑配置还是win7了,可是自己没有安装iis的权限,it也拒绝安装,想玩玩web安全都不行.于是乎决定开发一个window ...
- [leetcode]Pow(x, n) @ Python
原题地址:https://oj.leetcode.com/problems/powx-n/ 题意:Implement pow(x, n). 解题思路:求幂函数的实现.使用递归,类似于二分的思路,解法来 ...
- Maximum Submatrix & Largest Rectangle
相关题型 问题一(最大和子矩阵) : 有一个 m x n 的矩阵,矩阵的元素可正可负.请找出该矩阵的一个子矩阵(方块),使得其所有元素之和在所有子矩阵中最大.(问题来源:http://acm.pku. ...
- js操作XML文件兼容IE与FireFox
最近项目中用到了xml,需求是用户安装产品时先把一系列的数据保存到xml文件中,当执行到最后一步时才写入数据库,这样最大限度的减少了数据库的访问,于是不得不纠结在各浏览器的兼容性的问题(悲哀啊.... ...
- Improve your code with lint checks
官方文档 使用 Lint 改进您的代码 [Improve your code with lint checks] 除了[In addition to]测试 Android 应用以确保其符合功能要求[m ...
- 通过js去掉所有的html标签,得到HTML标签中的所有内容
<script> //替换掉所有的 html标签,得到Html标签中的内容 var s="<P><FONT face=宋体 color=#000000> ...