oracle有回表没有,ORACLE回表
要写出高效的SQL,那么必须必须得清楚SQL执行路径,介绍如何提高SQL性能的文章很多,这里不再赘述,本人来谈谈如何从 减少SQL回表次数 来提高查询性能,因为回表将导致扫描更多的数据块。
我们大家都知道,数据库表中数据存储都是以块为单位,称为数据块;表中每行数据都有唯一的地址标志ROWID。
举个例子:
select a from test_db where b=5
A、假设b上没有索引
1、那么该条SQL将进行表扫描,扫描所有该表的数据块
2、从数据块中找到记录,并且进行过滤
可想而知,没有索引将会导致扫描该表所有数据块,性能低下
B、 假设b上有索引
1、那么该条SQL将进行索引扫描,在索引中找到b=5的位置,一般只需要扫描3个块左右就找到了
2、获得所有b=5的行的rowid
3、根据rowid再查询数据(这就是回表),如果数据量少,那么回表次数就少,如果需要的数据全部在索引中,那么就不会再回表了,例如a也在索引中,如果a不在索引中,那么仍然要回表一次查出a。
经验:如果有可能的话,尽量只在索引上查询,不用回表或者只少量回表。
例如分页需要回表,一般尽量在索引上分页,然后返回rowid,再通过rowid进行回表查询。
下面是一个常用的分页语句:
Select * from (select row_number over(order by a) rn,t.* from table t where b=? And c=?) where rn>=1 and rn <=20
Select * from (select row_number over(order by a) rn,t.* from table t where b=? And c=?) where rn>=1 and rn <=20
我们分析一下(假设索引是b,c,a):
1、先查询内层语句 select * from table t where b=? and c=?,假设返回1000行数据
2、通过索引找到这1000行数据的rowid,因为索引是连续的,假设这1000行数据的索引分布在5个块中,则差不多为8块读
3、再根据rowid取回表查询数据,最坏的情况是这1000行数据分布在1000个块中,则需要读取1000块。那么算上上面的8块总共尧都区1000+8=1008块
我们换一种写法:
Select * from table t,
(select rid from (select rowid rid,row_number over(order by a) rn from table where b=? And c=?)
where rn>=1 and rn<=20) tmp
Where tmp.rid=t.rowid
Select * from table t,
(select rid from (select rowid rid,row_number over(order by a) rn from table where b=? And c=?)
where rn>=1 and rn<=20) tmp
Where tmp.rid=t.rowid
再来分析一下:
1、最里层的sql select rid from (select rowid rid,row_number over(order by a) rn from table where b=? And c=?) where rn>=1 and rn<=20 可以全部从索引中获得数据,由于索引有序,差不多也是8块读
2、分页之后,只有20行数据,再根据这20行的rowid回表查询数据,最坏情况是20行都在20个不同块中,那么总共20+8=28
从以上分析可以看出,有效的利用索引,减少回表次数,可以大大提高SQL性能,值得大家去花功夫了解一下。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lovingprince/archive/2009/04/16/4084786.aspx
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gybyylx/archive/2010/12/11/6070340.aspx
oracle有回表没有,ORACLE回表相关推荐
- Oracle 临时表、数据闪回、查询被锁表、系统常用表、及常用操作
目录 Oracle 系统常用表/视图 Oracle 临时表概述与创建 flashback 闪回表中被删除的数据 flashback 闪回整个被 drop 的表 查询 Oracle 中被锁定的表 查 ...
- oracle 闪回查询,闪回版本查询,闪回事务查询,闪回表,闪回删除,闪回数据库
文章目录 1. 闪回查询 1.1. 闪回时间查询 1.2. 闪回scn查询 (1) 获取scn号的方法 (2) 闪回scn查询命令 2. 闪回版本查询 3. 闪回事务查询 4. 闪回表 5. 闪回删除 ...
- oracle 闪回表定义,oracle闪回表详解
--- 说明闪回数据库 --- 使用闪回表将表内容还原到过去的特定时间点 --- 从删除表中进行恢复 --- 使用闪回查询查看截止到任一时间点的数据库内容 --- 使用闪回版本查询查看某一行在一段时间 ...
- 玩转oracle 11g(26):误删表数据和误删表回滚
14.误删除表中数据并提交(delete+commit) select * from med_dept_dict as of timestamp sysdate - 1/1440 描述:其中med_ ...
- 【Oracle】Drop表后闪回
本文介绍的闪回方式只适用于:删除表的表空间非system,drop语句中没有purge关键字(以上两种情况的误删除操作只能通过日志找回): 1.删除表后直接从回收站闪回 SCOTT@LGR> d ...
- oracle撤销段的功能,oracle撤销表空间和回滚段
/* 撤销表空间 */ 通过使用撤销技术,能够为Oracle数据库提供以下功能: * 使用ROLLBACK语句撤销事务 * 进行数据库恢复 * 提供数据的读一致性 Oracle强烈建议DBA在Orac ...
- Oracle锁表 行级锁 表级锁 行级锁
2019独角兽企业重金招聘Python工程师标准>>> Oracle锁表 行级锁 表级锁 ---- 行被排他锁定 ----在某行的锁被释放之前,其他用户不能修改此行 ...
- Oracle编程入门经典 第7章 表
表是在行和列中存储数据的基本结构.而且,就如同Oracle向数据库整体增加特性一样,随着时间失衡,它也增强了表的概念,以适应更加复杂的应用要求.在本章中,我们将要讨论: Oracle中最常用的表类型, ...
- 闪回的用途与实战(闪回表,闪回删除,闪回重名删除,闪回版本查询)
闪回可以做的操作有如下几种类型: 1.当数据错误删除,并且提交时(flashback table) 2.当错误删除了一张表drop table(flashback drop) 3.通过闪回获取表的历史 ...
- Oracle数据库 ORA-01555 快照过旧 (undo表空间:撤销表空间)
UNDO表空间用于存放UNDO数据,当执行DML操作时,oracle会将这些操作的旧数据写入到UNDO段,以保证可以回滚或者一致读等,而临时表空间主要用来做查询和存放一些缓冲区数据.你听说UNDO也是 ...
最新文章
- [视频教程] docker端口映射与目录共享运行PHP
- 用例图(use case)
- 蓝桥杯 左baby右兄弟
- 1-1圆柱体的表面积(算法竞赛入门经典)
- python-类的装饰器-主要给类添加属性用途
- 快速删除从CSDN复制的代码行前的数字的方法
- 一键伪装成 Windows 10:Kali Linux 2019.4 版本推出 “Undercover” 模式
- QQ密技68招(超强)
- npm命令启动前端项目
- JDK17下载和配置及官网地址教程(新版JDK12之后,较简单)
- JavaScript实现文件读取、文件导出
- HTTP长连接和WebSocket长连接的区别
- 关于安控RTU和宏电DTU的通讯设置
- QAC/QAC++静态软件代码测试分析-试用工具
- W54 - 999、TensorFlow框架识别图片
- 台式计算机设置热点,台式电脑怎样设置wifi热点?设置wifi热点流程一览
- 使用SINet进行伪装目标检测
- 闷声发大财,中国 App 出海编年史及方法论
- python 阮一峰_阮一峰关于 Javascript 中闭包的解读是否正确?
- 分布式系统与网络分区
热门文章
- jQuery页面滚动图片等元素动态加载实现
- hdu 1398 Square Coins/hdu 1028 Ignatius and the Princess III
- 信息学奥赛一本通 1171:大整数的因子 | OpenJudge NOI 1.6 13:大整数的因子
- 信息学奥赛一本通 1079:计算分数加减表达式的值 | OpenJudge NOI 1.5 33
- 奇怪的电梯(洛谷-P1135)
- 家谱树(信息学奥赛一本通-T1351)
- 仙岛求药(信息学奥赛一本通-T1251)
- 书架(信息学奥赛一本通-T1228)
- 最大质因子序列(信息学奥赛一本通-T1410)
- A+B问题(信息学奥赛一本通-T1006)