Q
题目
在Oracle中,ROWID和ROWNUM的区别是什么?
A
答案
Oracle有两个著名的伪列ROWID和ROWNUM,下面分别来介绍它们。
(一)ROWID
ROWID是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的。对每个表都有一个ROWID的伪列,但是表中并不物理存储ROWID列的值。不过可以像使用其它列那样使用它,但是不能删除该列,也不能对该列的值进行修改、插入。
ROWID对访问一个表中的给定的行提供了最快的访问方法,通过ROWID可以直接定位到相应的数据块上,然后将其读到内存。当创建一个索引时,该索引不但存储索引列的值,而且也存储索引值所对应的行的ROWID,这样通过索引就可以快速找到相应行的ROWID,通过该ROWID,就可以迅速将数据查询出来。这也就是在使用索引查询时,速度比较快的原因。
一般来说,当表中的行确定后,ROWID就不会发生变化,一旦一行数据插入数据库,ROWID在该行的生命周期内是唯一的,即使该行产生行迁移,行的ROWID也不会改变,UPDATE不会改变ROWID,INSERT更不会。从ROWID定义可知,只有当数据行的物理位置改变时才会导致ROWID改变,所以,只需要关心那些会导致数据物理位置变化的操作即可。
ROWID可以分为以下几种类型:
l 物理ROWID:存储堆组织表、表簇、表分区、和索引分区中的行地址。
l 逻辑ROWID:存储索引组织表中的行地址。
l 外部ROWID:是外来表(如通过网关访问的DB2表)中的标识符。它们不是标准的Oracle数据库ROWID。
有一种数据类型称为通用ROWID或UROWID,支持各种ROWID。
当如下情况发生时,ROWID将发生改变,即当数据迁移到其它块的时候,ROWID就会改变:
(1)对一个表做表空间的移动或重建后。
(2)对一个表进行了exp/imp或expdp/impdp后。
(3)MOVE、FLASHBACK TABLE、修改分区键值到另一个分区、分区表的分区数据转移到其它分区、SHRINK TABLE等。
通过DBMS_ROWID可以获取文件号、块号等信息。
(二)ROWNUM
ROWNUM是一个伪列,不是真正的列,在表中并不真实存在,它是Oracle数据库从数据文件或缓冲区中读取数据的顺序。切勿理解成记录的行号(这是很多人一直这样认为的),例如想查询第二行记录按下面的方法是查询不到的:
SELECT * FROM SCOTT.TABLE_LHR WHERE ROWNUM=2;
ROWNUM主要应用于Top-N查询中。
DB笔试面试历史连接
http://mp.weixin.qq.com/s/Vm5PqNcDcITkOr9cQg6T7w |
---|
About Me:小麦苗
● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用
● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/
● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解
● 版权所有,欢迎分享本文,转载请保留出处
● 题目解答若有不当之处,还望各位朋友批评指正,共同进步