ROWID基础概念

在Oracle内部,每个数据表都有一个伪列ROWID,用于存放被称为ROWID的二进制值。每个ROWID代表了一行数据的存储地址。物理ROWID能够标识普通数据表中的一行信息。其中ROWID类型只能存储物理内容,而UROWID(universal rowid)类型可以存储物理,逻辑或外来(non-oracle)ROWID。

物理ROWID(PhysicalRowid)可以让我们快速的访问某些特定的行。只要行存在,它的物理ROWID就不会改变。高效稳定的物理ROWID在查询行集合、操作整个集合和更新子集是很有用的。例如,我们可以在UPDATE或DELETE语句的WHERE子句中比较UROWID变量和ROWID伪列来找出最近一次从游标中取出的行数据。

ROWID分类

  • ROWID

    • 物理ROWID(普通堆表中的ROWID)

      • 扩展ROWID(extended rowid)
      • 限制ROWID(restricted rowid),Oracle7以前的格式,现已不在使用。
    • 逻辑ROWID(索引组织表(IOT)的ROWID)

ROWID格式 [18位,4部分]

OOOOOOFFFBBBBBBRRR主要由四部分组成:

  1. “OOOOOO”代表数据对象号(Data Object Number),如上例中的”AAAUpY”,能够辨识数据库段。同一段中的模式对象,都有着相同的数据对象号。

  2. “FFF”代表文件号(File Number),如上例中的”AAE”,能辨识出包含行的数据文件。在数据库中,文件号是唯一的。

  3. “BBBBBB”代表块号(Block Number),如上例中的”AAAAlc”,能辨识出包含行的数据块。块号是与它们所在的数据文件相关,而不是表空间。所以,两个在同一表空间的行数据,如果它们处于不同的数据文件中,也可能有着相同的块号。

  4. “RRR”代表了行号(Row Number),如上例中的”AAA”-“AAJ”,可以辨识块中的行数据。

ROWID相关函数

-- Oracle提供了dbms_rowid来进行rowid的一些转换计算。-- 根据rowid抽取块对象编号
SELECT dbms_rowid.rowid_object(ROWID) FROM SAMPLE WHERE ROWNUM <=1;-- 根据rowid抽取表空间相对文件号
SELECT dbms_rowid.rowid_relative_fno(ROWID) FROM SAMPLE WHERE ROWNUM <=1;-- 根据rowid抽取块号
SELECT dbms_rowid.rowid_block_number(ROWID) FROM SAMPLE WHERE ROWNUM <=1;-- 根据rowid抽取行号
SELECT dbms_rowid.rowid_row_number(ROWID) FROM SAMPLE WHERE ROWNUM <=1;

ROWID的实际运用场景 -> 快速删除重复的记录

ROWID是数据的详细地址,通过ROWID,Oracle可以快速的定位某行具体的数据的位置。当表中有大量重复数据时,可以使用ROWID快速删除重复的记录。

实例:

--建表tbl
SQL> create table stu(no number,name varchar2(10),sex char(2));--添加测试记录
SQL> insert into stu values(1, 'ab',’男’);
SQL> insert into stu values(1, 'bb',’女’);
SQL> insert into stu values(1, 'ab',’男’);
SQL> insert into stu values(1, 'ab',’男’);
SQL> commit;

删除重复记录方法很多,列出两种常见方法。

(1) 通过创建临时表

可以把数据先导入到一个临时表中,然后删除原表的数据,再把数据导回原表,SQL语句如下:

SQL>create table stu_tmp as select distinct* from stu;
SQL>truncate table sut;                                                   //清空表记录
SQL>insert into stu select * from stu_tmp;                        //将临时表中的数据添加回原表

这种方法可以实现需求,但是很明显,对于一个千万级记录的表,这种方法很慢,在生产系统中,这会给系统带来很大的开销,不可行。

(2) 利用rowid结合max或min函数

使用rowid快速唯一确定重复行结合max或min函数来实现删除重复行。

SQL>delete from stu a where rowid not in (select max(b.rowid) from stu b where a.no=b.no and a.name = b.name and a.sex = b.sex);   //这里max使用min也可以或者用下面的语句
SQL>delete from stu a where rowid < (select max(b.rowid) from stu b where a.no=b.no and a.name = b.name and a.sex = b.sex);     //这里如果把max换成min的话,前面的where子句中需要把"<"改为">"跟上面的方法思路基本是一样的,不过使用了group by,减少了显性的比较条件,提高效率。
SQL>delete from stu where rowid not in (select max(rowid) from stu t group by t.no, t.name, t.sex );思考:若在stu表中唯一确定任意一行数据(1, 'ab',’男’),把sex字段更新为”女”,怎么做?
SQL>update stu set sex=’女’ where rowid=(select min(rowid) from stu where no=1 and name=’ab’ and sex=’男’);

详述ROWID的原理及其使用相关推荐

  1. 白平衡算法简单原理以及灰色世界、完美反射实现

    这篇文章是一次课程作业,发到网上以供参考,由于时间有点紧张导致有些部分不够详尽以及有些方法没有实现,之后如果有机会再进行补充. 作业要求 以下两题任选一道完成,自选合适的测试图象,提交代码.实验结果和 ...

  2. 深入剖析原理!三个月啃透888页Java王者级核心宝典,真香!

    前言 关于为什么要有分布式锁这个东西,欢迎阅读我的zk分布式锁的实现,介绍了单机高并发.分布式高并发的解决方案: 用ZooKeeper实现分布式锁 这里再切入本例将使用的场景模拟:商品秒杀,或者说高并 ...

  3. MySQL中order by语句的实现原理以及优化手段

    相信很多人在面试过程中,总被问到有没有 SQL 调优经验,对于工作经验年限较少的求职者,通常都是在面试之前从网上百度一些答案,提前背熟,然后面试的时候直接将提前背好的答案说出来.笔者作为一名菜鸟,在刚 ...

  4. 【重要】MySQL中order by语句的实现原理以及优化手段

    写在前面 filesort排序算法参考 :https://blog.csdn.net/lijingkuan/article/details/70341176 双路排序:是首先根据相应的条件取出相应的排 ...

  5. 全世界都在问Java开发凉了吗?意外的惊喜

    01 阿里面试题之MySQL 之前的阿里面试题都有做总结,具体面试题内容整理成了文档,本文是针对MySQL系列的,所以下面只展示了自己第一次面试阿里时被吊打问到的一些MySQL难题 请解释关系型数据库 ...

  6. 巧用iptables搞定SYN洪水攻击!

    SYN Flood (SYN洪水) 是种典型的DoS (Denial of Service,拒绝服务) 攻击,属于DDos攻击的一种.遭受攻击后服务器TCP连接资源耗尽,最后停止响应正常的TCP连接请 ...

  7. mysql系列问答题_(2)MySQL运维基础知识面试问答题

    面试题001:请解释关系型数据库概念及主要特点? 面试题002:请说出关系型数据库的典型产品.特点及应用场景? 面试题003:请解释非关系型数据库概念及主要特点? 面试题004:请说出非关系型数据库的 ...

  8. python的特征提取实验一_在opencv3中使用ORB进行特征提取实验-Python版

    ORB (Oriented FAST and Rotated BRIEF) 分为两部分: 特征点提取 -由FAST(Features from Accelerated Segment Test)算法发 ...

  9. 单片机小白学步系列(四) 模拟电路、传统数字电路与单片机

    大家都用过计算器,有没有想过它是怎么实现的呢?这里我不详述计算器的原理,而只对思路进行简单介绍.等我们学会了单片机,也可以亲手制作一个计算器.通过电路进行数学计算,应该怎么做呢?为了便于理解,下面我举 ...

最新文章

  1. javaweb 图书管理系统完整代码_看一名Java开发人员以红队思维五分钟审计一套代码(续)...
  2. java 链表 最小堆优先级队列_Java集合细说
  3. 算法优化——位运算的优化技巧
  4. python如何把二进制转文本_在python3中如何把文本转换为二进制
  5. 4 相机切换_价格屠夫、训练伴侣——海鸟4K运动相机简评
  6. linux中如何记录时间
  7. 网络扫描实验(win10使用nmap,X-Scan工具使用)
  8. ppapi获取html,在HTML中给PPAPI插件配置参数
  9. 主流视频编码器特点、优缺点归纳和比较(H.264、HEVC、VP9、AV1)
  10. PC材料热性能五大分析方法(TG,TMA,DSC,DMA,DETA)
  11. CTSC2018 APIO2018 颓废 + 打铁记
  12. (三)夯基础——urllib基本库的使用1.0
  13. 隐私保护和数据安全:区块链的隐私问题、零钞:基于zkSNARK的完美混币池、Hawk:保护合约数据私密性、Coco框架、Baby Zoe
  14. drf-路由组件:自动生成Routers路由、 使用方法、视图集中附加action的声明、自动生成路由router的两种方式的URL区别
  15. 概率论与数理统计 | (3) 随机变量
  16. 打印等腰三角形图案[1]
  17. 前端工程师到底有哪些晋升和发展方向选择?
  18. 【Orangepi Zero2 全志H616】语音刷抖音 / 手机连接Linux热拔插相关
  19. STC8A单片机功能和应用电路
  20. matlab系统辨识尝试之详细过程1,Matlab系统辨识尝试之详细过程1

热门文章

  1. 嵌入式开发 | 嵌入式系统抗干扰设计
  2. camera DTU方案
  3. Linux:文件的解压缩——zip和tar压缩工具
  4. 惠普202打印机连打每张间隔时间长
  5. 学子寄语(7/18)(3)
  6. verilog实现十字路口交通灯(含课设报告)
  7. 高仿天猫读书首页的滑动切换效果:采用RecycleView + PagerSnapHelper 实现ViewPager的效果
  8. C语言实现扫雷(内含递归展开)
  9. VisualVM安装插件报错 总结
  10. html收货地址填写怎么做才合理_匀思电商:拼多多卖家设置发货地址有哪些注意事项?...