暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在Oracle中,ROWID和ROWNUM的区别是什么?

DB宝 2018-03-20
1449



Q
题目


Oracle中,ROWIDROWNUM的区别是什么?




     

A
答案


Oracle有两个著名的伪列ROWIDROWNUM,下面分别来介绍它们。

(一)ROWID

ROWID是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的。对每个表都有一个ROWID的伪列,但是表中并不物理存储ROWID列的值。不过可以像使用其它列那样使用它,但是不能删除该列,也不能对该列的值进行修改、插入。

ROWID对访问一个表中的给定的行提供了最快的访问方法,通过ROWID可以直接定位到相应的数据块上,然后将其读到内存。创建一个索引时,该索引不但存储索引列的值,而且也存储索引值所对应的行的ROWID,这样通过索引就可以快速找到相应行的ROWID,通过该ROWID,就可以迅速将数据查询出来。这也就是在使用索引查询时,速度比较快的原因。

一般来说,当表中的行确定后,ROWID就不会发生变化一旦一行数据插入数据库,ROWID在该行的生命周期内是唯一的,即使该行产生行迁移,行的ROWID也不会改变UPDATE不会改变ROWIDINSERT更不会。ROWID定义可知只有数据行的物理位置改变才会导致ROWID改变,所以,只需要关心那些会导致数据物理位置变化的操作即可。

ROWID可以分为以下几种类型:

物理ROWID:存储堆组织表、表簇、表分区、和索引分区中的行地址。

逻辑ROWID:存储索引组织表中的行地址。

外部ROWID:是外来表(如通过网关访问的DB2表)中的标识符。它们不是标准的Oracle数据库ROWID

有一种数据类型称为通用ROWIDUROWID,支持各种ROWID

当如下情况发生时,ROWID将发生改变,即当数据迁移到其它块的时候ROWID就会改变

1)对一个表做表空间的移动或重建后。

2)对一个表进行了exp/impexpdp/impdp后。

3MOVEFLASHBACK 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/

 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

 版权所有,欢迎分享本文,转载请保留出处

 QQ:646634621  QQ群:618766405

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。


最后修改时间:2020-01-10 20:47:32
文章转载自DB宝,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论