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

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
分享到:
评论

相关推荐

    数据库 创建索引 sql oracle

    "数据库创建索引SQL Oracle" 数据库索引是数据库性能优化的重要手段之一。创建索引可以提高查询速度,降低数据库的负载,提高数据的安全性。本文将详细介绍数据库创建索引的原则、分类、创建方法、管理和优化等方面...

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

    以上是Oracle数据库中创建表、索引、表空间、触发器、用户和序列的基本操作。在实际应用中,根据业务需求可能还需要考虑其他因素,如分区、约束、存储过程、视图等。掌握这些基本操作对于理解和管理Oracle数据库至关...

    Oracle在线建立超大表的索引

    ### Oracle在线建立超大表的索引 #### 需求背景 在Oracle数据库中,为含有千万级别记录的大表创建索引是一项挑战性任务,尤其是对于那些处于高并发在线生产环境中的表。本文将详细介绍如何为一个核心大表(INFO_...

    oracle、sql数据库批量建索引

    Oracle和SQL Server作为两种广泛应用的关系型数据库管理系统,都支持创建和管理索引以优化查询速度。本文将深入探讨这两个数据库系统中如何批量创建和删除索引,以及它们对系统运行效率的影响。 首先,让我们了解...

    oracle创建表创建唯一索引

    在Oracle数据库管理系统中,创建表和唯一索引是数据库设计中的关键步骤,它们对于数据的组织、查询效率和数据完整性至关重要。以下将详细介绍如何创建学员信息表,创建唯一索引,以及如何修改表来添加主键和检查约束...

    oracle在线创建索引和重组索引

    Oracle 在线创建索引和重组索引 Oracle 在线创建索引和重组索引是数据库管理员经常需要处理的问题。在线创建索引可以提高查询性能,而重组索引可以减少索引的碎片化和空间浪费。下面我们将详细介绍在线创建索引和...

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

    2. **`mailsend`表的全表扫描**:更严重的问题在于,`mailsend`表在查询条件下未能有效利用索引,导致了全表扫描,极大地消耗了系统资源。 #### 索引优化措施 针对上述问题,采取了以下优化措施: 1. **创建索引*...

    ORACLE索引详解及SQL优化

    Oracle数据库是全球广泛使用的数据库系统之一,其性能优化的关键之一在于有效的索引设计与使用。本文将深入探讨Oracle索引的原理、创建方法,并结合SQL优化策略,帮助你提升数据库查询速度,降低资源消耗。 首先,...

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

    oracle 用户 全部 索引 all index sql

    SqlServer表结构转oracle表结构

    C#代码可以通过ADO.NET或者其他数据库访问库连接到SQL Server和Oracle,读取SQL Server的表结构,然后在Oracle中创建相应的表。 3. **注释迁移**:在SQL Server中的表注释和字段注释,通常存储在系统视图中。C#代码...

    [Oracle]如何在亿级记录表中创建索引

    ### Oracle中亿级记录表创建索引的知识点详解 #### 一、背景介绍 在Oracle数据库中处理亿级数据量的表时,合理的索引设计是优化查询性能的关键因素之一。索引能够加快数据检索的速度,减少I/O操作次数,但同时也...

    Oracle Sql基础(beginning oracle sql中文版)

    CREATE语句用于创建表、视图、索引、存储过程等数据库对象,ALTER语句用于修改已存在的对象,DROP语句用于删除对象。DDL语句改变数据库的结构。 七、连接(JOIN) 在Oracle SQL中,可以使用INNER JOIN、LEFT JOIN、...

    Oracle SQL高级编程

    6. 索引优化:分析和创建索引以优化查询性能,包括位图索引和函数式索引。 7. 视图:利用视图简化复杂查询,保护数据安全,并提供抽象层。 8. 数据库性能调优:识别和解决SQL语句中的性能瓶颈,使用Oracle的自动工作...

    oracle sql优化100条

    以下将详细解读部分Oracle SQL优化原则,涵盖查询执行计划、表扫描方式、SQL语句优化及数据访问顺序等方面。 #### 1. 查询执行计划的选择模式 Oracle提供了三种查询执行计划选择模式:`RULE`(基于规则)、`COST`...

    oracle 创建和删除索引

    ### Oracle 创建和删除索引详解 #### 一、Oracle索引概述 在Oracle数据库中,索引是一种重要的数据结构,用于提高数据检索速度。通过创建索引,可以显著提升查询性能,尤其是在处理大型数据表时更为明显。索引类似...

    Oracle-SQL.rar_oracle_oracle sql_sql

    3. **创建数据库对象**:使用DDL,你可以创建表、视图、索引、存储过程、函数等。例如,创建一个表的命令是`CREATE TABLE 表名 (列名 数据类型, 列名 数据类型, ...);` 4. **查询数据**:DQL是最常用的SQL部分,`...

    oracle SQL语法大全

    Oracle SQL优化包括查询优化、索引优化、存储优化、资源管理等,通过EXPLAIN PLAN和SQL Profiler等工具分析和改进SQL性能。 总结,"Oracle SQL语法大全"涵盖了Oracle SQL的各个方面,无论你是初学者还是有经验的...

Global site tag (gtag.js) - Google Analytics