共计 1402 个字符,预计需要花费 4 分钟才能阅读完成。
一、访问数据的方法
Oracle 访问表中数据的方法有两种,一种是直接表中访问数据,另外一种是先访问索引,如果索引数据不符合目标 SQL,就回表,符合就不回表,直接访问索引就可以。
本文先介绍直接访问数据的方法,下一篇介绍访问索引的方法
1、直接访问数据
Oracle 直接访问表中数据的方法又分为两种:一种是全表扫描;另一种是 ROWID 扫描
1.1 全表扫描
全表扫描是 Oracle 直接访问数据的一种方法,全表扫描时从第一个区 (EXTENT) 的第一个块 (BLOCK) 开始扫描,一直扫描的到表的高水位线(High Water Mark),这个范围内的数据块都会扫描到
全表扫描是采用多数据块一起扫的,并不是一个个数据库扫的,然后我们经常说全表扫描慢是针对数据量很多的情况,数据量少的话,全表扫描并不慢的,不过随着数据量越多,高水位线也就越高,也就是说需要扫描的数据库越多,自然扫描所需要的 IO 越多,时间也越多
注意:数据量越多,全表扫描所需要的时间就越多,然后直接删了表数据呢?查询速度会变快?其实并不会的,因为即使我们删了数据,高位水线并不会改变,也就是同样需要扫描那么多数据块
1.2 ROWID 扫描
ROWID 也就是表数据行所在的物理存储地址,所谓的 ROWID 扫描是通过 ROWID 所在的数据行记录去定位。ROWID 是一个伪列,数据库里并没有这个列,它是数据库查询过程中获取的一个物理地址,用于表示数据对应的行数。
用 sql 查询:
select t.* , rowid from 表格
随意获取一个 ROWID 序列:AAAWSJAAFAAAWwUAAA,前 6 位表示对象编号(Data Object number),其后 3 位文件编号(Relative file number),接着其后 6 位表示块编号(Block number),再其后 3 位表示行编号(Row number)
ROWID 编码方法是:A ~ Z 表示 0 到 25;a ~ z 表示 26 到 51;0~9 表示 52 到 61;+ 表示 62;/ 表示 63;刚好 64 个字符。
这里随意找张表查一下文件编号、区编号、行编号,查询后会返回 rowid 的一系列物理地址和文件编号(rowid_relative_fno(rowid))、块编号(rowid_block_number(rowid))、行编号(rowid_row_number(rowid))
select t.seq,
rowid,
dbms_rowid.rowid_relative_fno(rowid),
dbms_rowid.rowid_block_number(rowid),
dbms_rowid.rowid_row_number(rowid)
from t_info t
SQL 查询一下表格名称为 TABLE 的对象编码
select owner,object_id,data_object_id,status from dba_objects where object_name='TABLE';
相对文件 id 和绝对文件编码
相对文件 id 是指相对于表空间,在表空间唯一; 绝对文件编码是指相当于全局数据库而言的,全局唯一;下面 SQL 查询一下相对文件 id 和绝对文件编码
select file_name,file_id,relative_fno from dba_data_files;
更多 Oracle 相关信息见Oracle 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=12
: