要写出高效的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回表相关推荐

  1. Oracle 临时表、数据闪回、查询被锁表、系统常用表、及常用操作

    目录 Oracle 系统常用表/视图 Oracle 临时表概述与创建 flashback  闪回表中被删除的数据 flashback  闪回整个被 drop 的表 查询 Oracle 中被锁定的表 查 ...

  2. oracle 闪回查询,闪回版本查询,闪回事务查询,闪回表,闪回删除,闪回数据库

    文章目录 1. 闪回查询 1.1. 闪回时间查询 1.2. 闪回scn查询 (1) 获取scn号的方法 (2) 闪回scn查询命令 2. 闪回版本查询 3. 闪回事务查询 4. 闪回表 5. 闪回删除 ...

  3. oracle 闪回表定义,oracle闪回表详解

    --- 说明闪回数据库 --- 使用闪回表将表内容还原到过去的特定时间点 --- 从删除表中进行恢复 --- 使用闪回查询查看截止到任一时间点的数据库内容 --- 使用闪回版本查询查看某一行在一段时间 ...

  4. 玩转oracle 11g(26):误删表数据和误删表回滚

    14.误删除表中数据并提交(delete+commit) select * from  med_dept_dict as of timestamp sysdate - 1/1440 描述:其中med_ ...

  5. 【Oracle】Drop表后闪回

    本文介绍的闪回方式只适用于:删除表的表空间非system,drop语句中没有purge关键字(以上两种情况的误删除操作只能通过日志找回): 1.删除表后直接从回收站闪回 SCOTT@LGR> d ...

  6. oracle撤销段的功能,oracle撤销表空间和回滚段

    /* 撤销表空间 */ 通过使用撤销技术,能够为Oracle数据库提供以下功能: * 使用ROLLBACK语句撤销事务 * 进行数据库恢复 * 提供数据的读一致性 Oracle强烈建议DBA在Orac ...

  7. Oracle锁表 行级锁 表级锁 行级锁

    2019独角兽企业重金招聘Python工程师标准>>> Oracle锁表  行级锁  表级锁 ---- 行被排他锁定 ----在某行的锁被释放之前,其他用户不能修改此行       ...

  8. Oracle编程入门经典 第7章 表

    表是在行和列中存储数据的基本结构.而且,就如同Oracle向数据库整体增加特性一样,随着时间失衡,它也增强了表的概念,以适应更加复杂的应用要求.在本章中,我们将要讨论: Oracle中最常用的表类型, ...

  9. 闪回的用途与实战(闪回表,闪回删除,闪回重名删除,闪回版本查询)

    闪回可以做的操作有如下几种类型: 1.当数据错误删除,并且提交时(flashback table) 2.当错误删除了一张表drop table(flashback drop) 3.通过闪回获取表的历史 ...

  10. Oracle数据库 ORA-01555 快照过旧 (undo表空间:撤销表空间)

    UNDO表空间用于存放UNDO数据,当执行DML操作时,oracle会将这些操作的旧数据写入到UNDO段,以保证可以回滚或者一致读等,而临时表空间主要用来做查询和存放一些缓冲区数据.你听说UNDO也是 ...

最新文章

  1. [视频教程] docker端口映射与目录共享运行PHP
  2. 用例图(use case)
  3. 蓝桥杯 左baby右兄弟
  4. 1-1圆柱体的表面积(算法竞赛入门经典)
  5. python-类的装饰器-主要给类添加属性用途
  6. 快速删除从CSDN复制的代码行前的数字的方法
  7. 一键伪装成 Windows 10:Kali Linux 2019.4 版本推出 “Undercover” 模式
  8. QQ密技68招(超强)
  9. npm命令启动前端项目
  10. JDK17下载和配置及官网地址教程(新版JDK12之后,较简单)
  11. JavaScript实现文件读取、文件导出
  12. HTTP长连接和WebSocket长连接的区别
  13. 关于安控RTU和宏电DTU的通讯设置
  14. QAC/QAC++静态软件代码测试分析-试用工具
  15. W54 - 999、TensorFlow框架识别图片
  16. 台式计算机设置热点,台式电脑怎样设置wifi热点?设置wifi热点流程一览
  17. 使用SINet进行伪装目标检测
  18. 闷声发大财,中国 App 出海编年史及方法论
  19. python 阮一峰_阮一峰关于 Javascript 中闭包的解读是否正确?
  20. 分布式系统与网络分区

热门文章

  1. jQuery页面滚动图片等元素动态加载实现
  2. hdu 1398 Square Coins/hdu 1028 Ignatius and the Princess III
  3. 信息学奥赛一本通 1171:大整数的因子 | OpenJudge NOI 1.6 13:大整数的因子
  4. 信息学奥赛一本通 1079:计算分数加减表达式的值 | OpenJudge NOI 1.5 33
  5. 奇怪的电梯(洛谷-P1135)
  6. 家谱树(信息学奥赛一本通-T1351)
  7. 仙岛求药(信息学奥赛一本通-T1251)
  8. 书架(信息学奥赛一本通-T1228)
  9. 最大质因子序列(信息学奥赛一本通-T1410)
  10. A+B问题(信息学奥赛一本通-T1006)