要写出高效的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进行回表查询。

下面是一个常用的分页语句:

  1. 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块

我们换一种写法:

  1. Select * from table t,
  2. (select rid from (select rowid rid,row_number over(order by a) rn from table where b=? And c=?)
  3. where rn>=1 and rn<=20) tmp
  4. 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/article/details/4084786

(转)减少oracle sql回表次数 提高SQL查询性能的更多相关文章

  1. 检测SQL Server表占用空间大小SQL

    检测SQL Server表占用空间大小SQL,要先选择需要查询的数据库,然后点击执行下面脚本. ),ROWS ),reserved ) ,Data ) ,index_size ) ,Unused ) ...

  2. Oracle多表连接,提高效率,性能优化 (转)

    执行路径:ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单表数据的统计比多表统计的速度完全是两个概念.单表统计可能只要0.02秒,但是2张表联合统计就可能要几十表了. ...

  3. Oracle 闪回表实验

    工:闪回表实验 1.结构测试表flb_test,数据不小于10000行: TEST_USER1@PROD>create table flb_test(id number,dd date); Ta ...

  4. Oracle闪回表

    Oracle闪回技术 场景:测试环境数据库的表数据被误删除. 解决思路:使用闪回表技术 原理 闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小 ...

  5. oracle闪回表详解

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

  6. MySQL查询缓存设置提高MySQL查询性能

    首先看看MSYQL逻辑框架:图片来自高性能mysql 如果使用了QueryCache,当查询接收到一个和之前同样的查询,服务器将会从查询缓存中检索结果,而不是再次分析和执行相同的查询.这样就能大大提高 ...

  7. Oracle常用数据库系统表单以及SQL的整理

    因为最近涉及到了一些数据库的归档,备份等工作,所以一部分的重心放在了数据库上,毕竟之前对数据库的了解也只停留在了一般的建表,查询,最多最多再写一写触发器之类的东西. 通常都是自己瞎搞搞,也就懂一点皮毛 ...

  8. Oracle 查看锁定表用户的SQL

    #描述:当执行如下SQL select * From XXX for Updata 发现表“XXX”被锁定 #只需要执行如下SQL 查看锁定该表的用户 SELECT object_name, mach ...

  9. Oracle查找全表扫描的SQL语句

    原文链接:http://blog.itpub.net/9399028/viewspace-678358/ 对于SQL的执行计划,一般尽量避免TABLE ACCESS FULL的出现,那怎样去定位,系统 ...

随机推荐

  1. 单个页面Request编码方式的改变,无需改动Web.config~

    搞一个东西,从别人的接口接一段中文,URL传输,怎么都有乱码~~ 得到对方的编码方式是gb2312,于是用HttpUtility.UrlDecode(_smssend_content, System. ...

  2. CSS3学习-用CSS制作立体导航栏

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. CSS冗余简化(持续更新)

    1.float属性会把元素默认成inline-block状态,不需要再专门定义display了 2.对于inline而言,您设置line-height多大,很多时候并不需要定义height,其实际占据 ...

  4. Android Studio maven-metadata.xml 卡着不动原因和解决方法

    头一天好好的,第二天就卡着了. 一直在这个地方不动,如果停止就会报 Error:Could not run build action using Gradle distribution ‘https: ...

  5. npm相关命令

    npm install npm install log4js npm list npm list log4js #查看模板安装版本 npm install log4js@1.0.1 #指定模块版本安装 ...

  6. java控制远程ssh-JSCH(二)

    github: https://github.com/wengyingjian/ssh-java-demo.git 这次找到了一套新的api,叫jsch.网上查了一下,顺便把官网的几个demo给一通拿 ...

  7. Exchange 用户邮箱导入/导出

    在第2部分中,我将向您介绍如何使用Exchange Server中提供的新cmdlet导入/导出数据,以及如何查看导入和导出的信息统计信息这样做. 走起! 将数据从PST文件导入到邮箱 现在是时候尝试 ...

  8. BZOJ 4881: [Lydsy2017年5月月赛]线段游戏

    4881: [Lydsy2017年5月月赛]线段游戏 Time Limit: 3 Sec  Memory Limit: 256 MBSubmit: 164  Solved: 81[Submit][St ...

  9. python基础教程总结15——2 画幅好画

    要求:从Internet上下载数据文件:  分析数据文件并提取感兴趣的部分 工具:图形生成包(ReportLab,PYX等) 数据:太阳黑子和射电辐射流量(http://services.swpc.n ...

  10. 方法的重写【java语言】

    1.父类 package com.wyq.study; public class Father{//书写类 //书写属性 private String name; private int age; / ...