WEB开发网
开发学院数据库Oracle 存取Oracle当中扫描数据的方法 阅读

存取Oracle当中扫描数据的方法

 2008-08-23 12:42:30 来源:WEB开发网   
核心提示: 进一步讲,如果sql语句中对索引列进行排序,存取Oracle当中扫描数据的方法(3),因为索引已经预先排序好了,所以在执行计划中不需要再对索引列进行排序SQL>explainplanforselectempno,enamefromempwhereempno>7876orderb

进一步讲,如果sql语句中对索引列进行排序,因为索引已经预先排序好了,所以在执行计划中不需要再对索引列进行排序

   SQL>explainplanforselectempno,enamefromemp
  whereempno>7876orderbyempno;
  QueryPlan
  SELECTSTATEMENT[CHOOSE]Cost=1
  TABLEACCESSBYROWIDEMP[ANALYZED]
  INDEXRANGESCANEMP_I1[ANALYZED]

从这个例子中可以看到:因为索引是已经排序了的,所以将按照索引的顺序查询出符合条件的行,因此避免了进一步排序操作。

根据索引的类型与where限制条件的不同,有4种类型的索引扫描:

索引唯一扫描(index unique scan)

索引范围扫描(index range scan)

索引全扫描(index full scan)

索引快速扫描(index fast full scan)

(1) 索引唯一扫描(index unique scan)

通过唯一索引查找一个数值经常返回单个ROWID。如果存在UNIQUE 或PRIMARY KEY 约束(它保证了语句只存取单行)的话,Oracle经常实现唯一性扫描。

使用唯一性约束的例子:

   SQL>explainplanfor
  selectempno,enamefromempwhereempno=10;
  QueryPlan
  SELECTSTATEMENT[CHOOSE]Cost=1
  TABLEACCESSBYROWIDEMP[ANALYZED]
  INDEXUNIQUESCANEMP_I1

(2) 索引范围扫描(index range scan)

使用一个索引存取多行数据,在唯一索引上使用索引范围扫描的典型情况下是在谓词(where限制条件)中使用了范围操作符(如>、<、<>、>=、<=、between)

使用索引范围扫描的例子:

   SQL>explainplanforselectempno,enamefromemp
  whereempno>7876orderbyempno;
  QueryPlan
  SELECTSTATEMENT[CHOOSE]Cost=1
  TABLEACCESSBYROWIDEMP[ANALYZED]
  INDEXRANGESCANEMP_I1[ANALYZED]

上一页  1 2 3 4  下一页

Tags:存取 Oracle 当中

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