WEB开发网
开发学院数据库Oracle Oracle语句优化规则汇总(5) 阅读

Oracle语句优化规则汇总(5)

 2008-02-19 12:40:43 来源:WEB开发网   
核心提示: 例如:表LODGING有两个索引 : 建立在LODGING列上的唯一性索引LODGING_PK和建立在MANAGER列上的非唯一性索引LODGING$MANAGER.SELECT*FROMLODGINGWHERELODGING=‘ROSEHILL’;在内部 , 上述

例如:

表LODGING有两个索引 : 建立在LODGING列上的唯一性索引LODGING_PK和建立在MANAGER列上的非唯一性索引LODGING$MANAGER.

  SELECT*
  FROMLODGING
  WHERELODGING=‘ROSEHILL’;

在内部 , 上述SQL将被分成两步执行, 首先 , LODGING_PK 索引将通过索引唯一扫描的方式被访问 , 获得相对应的ROWID, 通过ROWID访问表的方式执行下一步检索。

如果被检索返回的列包括在INDEX列中,ORACLE将不执行第二步的处理(通过ROWID访问表)。 因为检索数据保存在索引中, 单单访问索引就可以完全满足查询结果。

下面SQL只需要INDEX UNIQUE SCAN 操作。

  SELECTLODGING
  FROMLODGING
  WHERELODGING=‘ROSEHILL’;

索引范围查询(INDEX RANGE SCAN)

适用于两种情况:

1. 基于一个范围的检索

2. 基于非唯一性索引的检索

例1:

SELECT LODGING FROM LODGING WHERE LODGING LIKE ‘M%’;

WHERE子句条件包括一系列值, ORACLE将通过索引范围查询的方式查询LODGING_PK . 由于索引范围查询将返回一组值, 它的效率就要比索引唯一扫描低一些。

例2:

  SELECTLODGING
  FROMLODGING
  WHEREMANAGER=‘BILLGATES’;

这个SQL的执行分两步, LODGING$MANAGER的索引范围查询(得到所有符合条件记录的ROWID) 和下一步同过ROWID访问表得到LODGING列的值。 由于LODGING$MANAGER是一个非唯一性的索引,数据库不能对它执行索引唯一扫描。

由于SQL返回LODGING列,而它并不存在于LODGING$MANAGER索引中, 所以在索引范围查询后会执行一个通过ROWID访问表的操作。

WHERE子句中, 如果索引列所对应的值的第一个字符由通配符(WILDCARD)开始, 索引将不被采用。在这种情况下,ORACLE将使用全表扫描。

  SELECTLODGING
  FROMLODGING
  WHEREMANAGERLIKE‘%HANMAN’;

上一页  1 2 3 

Tags:Oracle 语句 优化

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接