当前位置:  数据库>oracle

Oracle数据访问途径之索引扫描

    来源: 互联网  发布时间:2017-05-10

    本文导语: Oracle总共只有两种基本的数据访问途径:全扫描 或者索引扫描。 默认的索引类型是B-树索引。索引建立在表中的一个或多个列或者是列的表达式上,将列值和行编号(ROWID)一起存储。在索引中还保存着一些其他信息,但对你来...

Oracle总共只有两种基本的数据访问途径:全扫描 或者索引扫描。

默认的索引类型是B-树索引。索引建立在表中的一个或多个列或者是列的表达式上,将列值和行编号(ROWID)一起存储。在索引中还保存着一些其他信息,但对你来说仅需要关心列值和行编号即可。行编号是一个用来唯一标记表中行的伪列。它是物理表中行数据的内部地址,包含两个地址,其一为指向数据表中包含该行的块所存放数据文件的地址,另一个是可以直接定位到数据行自身的这一行在数据块中的地址。参见rowid详解  。

也就是说对于通过索引扫描所获取的每一行,都至少需要访问两个数据块:至少一个索引块和一个数据块。

索引扫描类型包括:索引范围扫描、索引唯一扫描、索引全表扫描、索引跳跃扫描、索引快速扫描。

索引的聚簇因子统计信息帮助优化器生成使用索引的成本信息,并且是表中建立了索引的数据排序优良度的一个度量值。索引的聚簇因子向优化器表明了具有同样索引值的数据行是不是存放在同一个或连续的一系列数据块中,或者数据行是否被分散存放在表的多个数据块中。参见聚簇因子笔记  。

注意:聚簇因子与表中数据而不是与索引相关。因此,重建索引对它没有任何影响。

索引唯一扫描(INDEX UNIQUE SCAN)

当谓语中包含使用unique或primary key索引的列作为条件的时候就会选用索引唯一扫描。这种类型的索引能够保证对于某个特定的值只返回一行数据。

索引范围扫描(INDEX RANGE SCAN)

    当谓语中包含将会返回一定范围数据的条件时就会选用索引范围扫描。范围越大,就越有可能会选用全扫描运算来代替它。也有一些情况下你觉得应该使用索引范围扫描,但实际上没有使用。例如,如果你使用一个以通配符开头的条件如'%abc'的LIKE运算符,优化器将不会选用该列上的索引范围扫描,因为条件太宽泛了。另一个类似的情况就是,当你有一个使用组合索引中非引导列的谓语时。在这种情况,将更可能选择使用索引跳跃扫描。

注意:索引范围扫描的最后一个精妙之处在于它能够使用一个升序排列的索引(默认值)来返回降序排列的数据行。

索引全表扫描(INDEX FULL SCAN)

有好几种情况下都将会选择索引全扫描,包括:当没有谓语但是所需获取列的列表可以通过其中一列的索引来获得,谓语中包含一个位于索引中非引导列上的条件,或者数据可以通过一个排过序的索引来获取并且会省去单独的排序步骤。索引全扫描运算将会扫描索引结构中的每一个叶子块,读取每个条目的行编号,并取出数据行。每个叶子块都要被访问。这通常比全表扫描效率要高,因为每一个索引块要比表数据块包含更多条目,从而总的需要访问的块数也就相应减少。在查询字段列表中所有字段都是索引条目的一部分的时候,就能够完全跳过访问表的步骤。这就意味着选用索引全扫描比读取所有的表数据块效率更高。

注意:索引全扫描也能够按降序来读取数据(升序数据)以避免进行单独的排序。对于索引全扫描还有另外一个最优方法,当需要查询某一列的最小或最大值而这一列又是索引列的时候。

索引跳跃扫描(INDEX SKIP SCAN)

当谓语中包含位于索引中非引导列上的条件,并且引导列的值是唯一 的时候会选择索引跳跃扫描。在早期的ORACLE版本中,如果一个谓语使用了索引中的非引导列,则该索引不能被选用。在9以后的版本中通过引入索引跳跃扫描得到了改变。

索引快速全扫描

索引快速全扫描更像全表扫描而不像其它类型的索引扫描。当选用索引快速全扫描时,所有索引块都将通过多块读取来进行。这种类型的索引扫描是用来在查询列表中所有字段都包含在索引中并且索引中至少有一列具有非空约束时替代全表扫描的。在这种情况下,数据通过索引来进行访问而不必访问表数据块。与其他索引扫描类型不同,索引快速全扫描并不能用来避免排序,因为数据块是通过无序的多表读取来的。

总之,索引快速全扫描运算依赖于非空约束的,如果没有这样的约束,将会选择全表扫描。


    
 
 

您可能感兴趣的文章:

  • 用Oracle 9i全索引扫描快速访问数据
  • Oracle与Mysql主键、索引及分页的区别小结
  • 从Oracle的约束到索引
  • Oracle 9i轻松取得建表和索引的DDL语句
  • Oracle9i取得建表和索引的DDL语句
  • oracle10g全文索引自动同步语句使用方法
  • Oracle建立二进制文件索引的方法
  • 在Oracle 10g中如何获得索引的专家建议
  • Oracle全文索引设置
  • Oracle中如何把表和索引放在不同的表空间里
  • Oracle索引存储关系到数据库的运行效率
  • Oracle索引聚簇表的数据加载
  • 在Oracle中监控和跟踪索引使用情况
  • oracle 索引的相关介绍(创建、简介、技巧、怎样查看) .
  • Oracle中检查是否需要重构索引的sql
  • 轻松取得Oracle 9i建表和索引DDL语句
  • 深度揭露Oracle索引使用中的限制
  • Oracle索引(B*tree与Bitmap)的学习总结
  • oracle 索引不能使用深入解析
  • SQL Server和Oracle数据库索引介绍
  • 深入oracle分区索引的详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,