oracle 回表是什么,ORACLE回表
要写出高效的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回表相关推荐
- Oracle的闪回特性之恢复truncate删除表的数据
/* 2008/06/06 *环境:Windows XP +Oracle10.2.0.1 *循序渐进oracle--数据库管理.优化与备份恢复 *循序渐进oracle第8章:Oracle的闪回特性之恢 ...
- oracle 闪回查询,闪回版本查询,闪回事务查询,闪回表,闪回删除,闪回数据库
文章目录 1. 闪回查询 1.1. 闪回时间查询 1.2. 闪回scn查询 (1) 获取scn号的方法 (2) 闪回scn查询命令 2. 闪回版本查询 3. 闪回事务查询 4. 闪回表 5. 闪回删除 ...
- oracle 减少回表,減少oracle sql回表次數 提高SQL查詢性能 | 學步園
要寫出高效的SQL,那麼必須必須得清楚SQL執行路徑,介紹如何提高SQL性能的文章很多,這裡不再贅述,本人來談談如何從 減少SQL回表次數 來提高查詢性能,因為回表將導致掃描更多的數據塊. 我們大家都 ...
- oracle撤销段的功能,oracle撤销表空间和回滚段
/* 撤销表空间 */ 通过使用撤销技术,能够为Oracle数据库提供以下功能: * 使用ROLLBACK语句撤销事务 * 进行数据库恢复 * 提供数据的读一致性 Oracle强烈建议DBA在Orac ...
- Oracle - 数据库的实例、表空间、用户、表之间关系
完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例. 1) 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等): 2) Oracle数据库实例则是一组Ora ...
- oracle中database,Oracle Database 一些基本的视图和表
近日收集了一些Oracle Database中DBA常用的表和视图,便于使用和学习之用.........[@more@] ☆dba_开头..... dba_users 数据库用户信息 dba_segm ...
- Oracle编程入门经典 第7章 表
表是在行和列中存储数据的基本结构.而且,就如同Oracle向数据库整体增加特性一样,随着时间失衡,它也增强了表的概念,以适应更加复杂的应用要求.在本章中,我们将要讨论: Oracle中最常用的表类型, ...
- 5.创建表,使用alter进行表信息的增删改,Oracle回收站,集合运算
1 Oracle基于用户的管理方案 2 DDL语句可以管理数据库的对象有:视图 索引 序列 同义词 约束 3 创建一个表,有2个条件(1 有权限:2有表空间) Oracle给你提 ...
- spool命令、创建一个表,创建并且copy表,查看别的用户下的表,rowid行地址 索引的时候使用,表的增删改查,删除表,oracle的回收站
1.spool 命令 spool "D:\test.txt" spool off SQL> host cls 2.创建一个表 SQL> --条件(1):有创 ...
- oracle表还原truncate,Oracle数据库之Oracle表恢复(truncate)
本文主要向大家介绍了Oracle数据库之Oracle表恢复(truncate),通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. 一.模拟truncate操作: SQL> c ...
最新文章
- Web充斥着存在漏洞的过期JavaScript库
- SpringBoot+MDC实现全链路调用日志跟踪,这才叫优雅!
- android volley 上传图片 和参数,Android使用Volley上传文件
- Apache - Storm
- 农村结婚彩礼礼金要三斤三两的百元大钞,这大概有多少钱?
- Python collection模块与深浅拷贝
- java Http请求工具类【post/get】
- 小马哥----高仿机部分6735芯片机型的root方法浅析 高仿三星Galaxy S6 A228_4G刷机root
- 小程序切出去重新进入
- Power Apps 中调用 Automate 工作流
- 计算机专业英语问卷调查,关于英语调查问卷的总结
- Python numpy.ones_like函数方法的使用
- Crackme#1算法注册机
- python实现合并多个excel中同名的sheet
- Ubuntu 20.04 安装 Seismic Unix
- 最新MTK芯片型号汇总,MTK开发资料大全下载
- 二十一世纪大学英语读写基础教程学习笔记(原文)——5 - Shipwrecked in Antarctica(沉船南极洲)
- 《C++ Concurrency in Action》笔记
- 3种将等高线转DEM的方法
- 新版UI聚合支付系统四方系统源码+修复漏洞完美版
热门文章
- 232.栈实现队列(力扣leetcode) 博主可答疑该问题
- jpress连接不上mysql_win10+jdk+mysql+tomcat+jpress环境搭建与部署
- centos7恢复mysql数据库_MySQL数据库之Centos7.3,mysql5.7环境,数据存储空间加大调整方案...
- Codeforces - 102222H - Fight Against Monsters - 贪心
- 使用py 和flask 实现的服务器系统目录浏览,日志文件实时显示到网页的功能
- Java Web GenericServlet
- Swift 模式匹配
- 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---36
- Linux下Mongodb安装和启动配置
- JAVA 如何将String进行大小写转换