`
哇哈哈852
  • 浏览: 87150 次
文章分类
社区版块
存档分类
最新评论

Oracle SQL建立有效索引减少回表

阅读更多


回表:在数据中,当查询数据的时候,在索引中查找索引后,获得该行的rowid,根据rowid再查询表中数据,就是回表。

在数据库中,数据的存储都是以块为单位的,称为数据块,表中每一行数据都有唯一的地址标志ROWID。每次使用SQL进行查询的时候,都要扫描数据块,找到行所在的ROWID,再扫描该表的数据块。回表将会导致扫描更多的数据块。

例如:SELECT a,b,cFROM TEST_DB WHERE b=1

在该查询语句执行的时候,可分为两种情况:

A. 在b上没有建立索引

如果在b上没有建立索引,那么该条SQL语句执行时,要进行全表扫描,扫描所有该表中的数据块。从该数据块中找到记录,并进行过滤。在没有索引时,查找数据会导致扫描表中所有数据块,性能较低。

B. 在b上建立索引

如果在b上建立索引,那么在执行该条SQL语句时,先进行索引扫描,在索引中找到b=1所在的位置(一般只需要扫描3个块数据即可),获得改行的ROWID,根据其ROWID再查询数据(回表),如果所查找的数据量较少,则回表次数就少。如上面的例子,要查询的数据只有b在索引中,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

在该分页查询语句中,我们建立B,C,A的索引,那么查询时,步骤如下:

1.先查询内层语句 SELECT *  FROM  TABLE T  WHERE  B=?  AND  C=?,假设返回1000行数据。

2.通过索引找到这1000行数据的ROWID,由于索引时连续的,所以假设这1000行数据的索引分布在3个数据块中,一般需要读取6个数据块。再根据ROWID取回表查询数据,最差的情况是这1000行数据分布在1000个数据块中,则需要读取1000块。那么总共需要读取的数据块区为1006块。

如果我们换另外一种写法:

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 RID  FROM (SELECT  ROWID RID, ROW_NUMBER  OVER(ORDER  BY A)  RN  FROM TABLE  WHERE  B=? AND  C=?) WHERE  RN >1 AND  RN<=20,可以全部在索引中获取到数据,和上面一样,也差不多为6数据块。分页之后,只有20行数据,在更具这20行的ROWID回表查询数据,最坏的情况是20行都在20个不同块中,那么总共也只扫描26块数据块。

因此,有效的利用索引,可以减少回表的次数,大大提升SQL性能。
  • 大小: 47.4 KB
分享到:
评论

相关推荐

    oracle创建表,索引,表空间,触发器,schema用户,序列的Sql文

    oracle创建表,索引,表空间,触发器,schema用户,序列的Sql文

    数据库 创建索引 sql oracle

    1.索引的创建与使用 2.创建索引的原则 3.索引的分类 4.创建索引的多种方法 5.管理索引 6.索引优化 7.查看、修改索引属性 8.修改索引名 9.删除索引

    oracle、sql数据库批量建索引

    oracle、sqlserver数据库批量删建索引,方便好用,提高数据库查询效率,提升系统运行效率,特别是数据量比较大的情况下

    Oracle+SQL优化之使用索引提示一例

    Oracle+SQL优化之使用索引提示一例

    ORACLE索引详解及SQL优化

    ORACLE索引详解及SQL优化,详细描述了几种常用索引原理以及创建方法,解读索引生效条件,以及在开发中常用的提高数据库效率、降低数据库资源消耗的方法。

    从oracle用户取全部索引的方法 index sql

    oracle 用户 全部 索引 all index sql

    oracle sql优化100条

    oracle sql常用的优化共100条,很实用

    大牛出手Oracle SQL优化实例讲解

    1.Oracle如何得到一个很大的表 2.loop insert 实例 3.autotrace验证索引的性能到底有多大? 4.EXPLAIN验证SQL是否走索引 5.结合autotrace创建并验证函数索引 6.sql trace分析工具--TKPROF详细讲解 7.V$SQL视图详解加...

    oracle sql调优原则

    oracle sql级别调优及书写原则,重点是使用索引及索引覆盖

    ORACLE SQL性能优化技巧

    书写高质量的oracle sql,用表连接替换EXISTS,索引的技巧等等

    oracle的索引学习

    oracle的索引学习,oracle的索引学习,oracle的索引学习

    oracle SQL优化技巧

    oracle的SQL语句优化及索引使用技巧

    ORACLE SQL性能优化文档大全(包括所有sql索引方面知识)

    ORACLE SQL性能优化文档大全(包括所有sql索引方面知识),非常明朗清晰,初学者易懂,深入研究者也有很大帮助

    Oracle SQL Handler(Oracle 开发工具) v5.1.zip

    Oracle SQL Handler,是专为Oracle数据库开发人员及操作人员精心打造的一款Oracle开发工具(客户端工具)。国产原创,精品奉献,无序列号限制,仅凭使用满意度随意赞助就可永久使用!   Oracle SQL Handler 特点...

    ORACLE SQL使用示例

    ORACLE SQL使用示例 二.创建索引 三.创建约束 四.创建视图 五. 创建序列 六. 创建同义词 七.SQL DML数据操纵语句 八,SQL内部函数 九. PLSQL 结构化程序

    ORACLE SQL性能优化

    ORACLE只对简单的表提供高速缓冲(cache buffering)这个功能并不适用于多表连接查询. 在数据高速缓冲区中存放着Oracle系统最近使用过的数据块(即用户的高速缓冲区),当把数据写入数据库时,它以数据块为单位进行...

    清除Oracle中无用索引

    基于功能的Oracle索引使得数据库管理人员有可能 在数据表的行上过度分配索引。过度分配索引会严重影响关键Oracle数据表的性能。在Oracle9i出现以前,没有办法确定SQL查询没有使用的索引。让我们看看Oracle9i提供了...

    oracle的sql优化

     索引最好单独建立表空间,必要时候对索引进行重建  必要时候可以使用函数索引,但不推荐使用  Oracle中的视图也可以增加索引,但一般不推荐使用  *Sql语句中大量使用函数时候会导致很多索引无法使用上,要针对...

Global site tag (gtag.js) - Google Analytics