要写出高效的SQL,那么必须必须得清楚SQL执行路径,介绍如何提高SQL性能的文章很多,这里不再赘述,本人来谈谈如何从 减少SQL回表次数 来提高查询性能,因为回表将导致扫描更多的数据块。 我们大家都知道,数据库表中数据存储都是以块为单位,称为数据块;表

要写出高效的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性能,值得大家去花功夫了解一下。

http://blog.csdn.net/lovingprince/archive/2009/04/16/4084786.aspx

http://blog.csdn.net/gybyylx/archive/2010/12/11/6070340.aspx

oracle 回表是什么,ORACLE回表相关推荐

  1. Oracle的闪回特性之恢复truncate删除表的数据

    /* 2008/06/06 *环境:Windows XP +Oracle10.2.0.1 *循序渐进oracle--数据库管理.优化与备份恢复 *循序渐进oracle第8章:Oracle的闪回特性之恢 ...

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

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

  3. oracle 减少回表,減少oracle sql回表次數 提高SQL查詢性能 | 學步園

    要寫出高效的SQL,那麼必須必須得清楚SQL執行路徑,介紹如何提高SQL性能的文章很多,這裡不再贅述,本人來談談如何從 減少SQL回表次數 來提高查詢性能,因為回表將導致掃描更多的數據塊. 我們大家都 ...

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

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

  5. Oracle - 数据库的实例、表空间、用户、表之间关系

    完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例. 1) 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等): 2) Oracle数据库实例则是一组Ora ...

  6. oracle中database,Oracle Database 一些基本的视图和表

    近日收集了一些Oracle Database中DBA常用的表和视图,便于使用和学习之用.........[@more@] ☆dba_开头..... dba_users 数据库用户信息 dba_segm ...

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

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

  8. 5.创建表,使用alter进行表信息的增删改,Oracle回收站,集合运算

     1  Oracle基于用户的管理方案 2 DDL语句可以管理数据库的对象有:视图   索引  序列  同义词   约束 3  创建一个表,有2个条件(1 有权限:2有表空间) Oracle给你提 ...

  9. spool命令、创建一个表,创建并且copy表,查看别的用户下的表,rowid行地址 索引的时候使用,表的增删改查,删除表,oracle的回收站

      1.spool 命令 spool "D:\test.txt" spool off SQL> host cls 2.创建一个表 SQL> --条件(1):有创 ...

  10. oracle表还原truncate,Oracle数据库之Oracle表恢复(truncate)

    本文主要向大家介绍了Oracle数据库之Oracle表恢复(truncate),通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. 一.模拟truncate操作: SQL> c ...

最新文章

  1. Web充斥着存在漏洞的过期JavaScript库
  2. SpringBoot+MDC实现全链路调用日志跟踪,这才叫优雅!
  3. android volley 上传图片 和参数,Android使用Volley上传文件
  4. Apache - Storm
  5. 农村结婚彩礼礼金要三斤三两的百元大钞,这大概有多少钱?
  6. Python collection模块与深浅拷贝
  7. java Http请求工具类【post/get】
  8. 小马哥----高仿机部分6735芯片机型的root方法浅析 高仿三星Galaxy S6 A228_4G刷机root
  9. 小程序切出去重新进入
  10. Power Apps 中调用 Automate 工作流
  11. 计算机专业英语问卷调查,关于英语调查问卷的总结
  12. Python numpy.ones_like函数方法的使用
  13. Crackme#1算法注册机
  14. python实现合并多个excel中同名的sheet
  15. Ubuntu 20.04 安装 Seismic Unix
  16. 最新MTK芯片型号汇总,MTK开发资料大全下载
  17. 二十一世纪大学英语读写基础教程学习笔记(原文)——5 - Shipwrecked in Antarctica(沉船南极洲)
  18. 《C++ Concurrency in Action》笔记
  19. 3种将等高线转DEM的方法
  20. 新版UI聚合支付系统四方系统源码+修复漏洞完美版

热门文章

  1. 232.栈实现队列(力扣leetcode) 博主可答疑该问题
  2. jpress连接不上mysql_win10+jdk+mysql+tomcat+jpress环境搭建与部署
  3. centos7恢复mysql数据库_MySQL数据库之Centos7.3,mysql5.7环境,数据存储空间加大调整方案...
  4. Codeforces - 102222H - Fight Against Monsters - 贪心
  5. 使用py 和flask 实现的服务器系统目录浏览,日志文件实时显示到网页的功能
  6. Java Web GenericServlet
  7. Swift 模式匹配
  8. 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---36
  9. Linux下Mongodb安装和启动配置
  10. JAVA 如何将String进行大小写转换