在使用Oracle的过程,我们就不能不考虑性能和SQL优化,而正确的使用索引是优化SQL中的很关键的因素。
如果发现Oracle在有索引的情况下而没有使用索引,这并不是Oracle的优化器出错。在有些情况下Oracle确实会选择全表扫描(Full Table Scan),而非索引扫描(Index Scan)。比如:
1、表未做分析或者分析信息太老,导致 Oracle 判断失误。
2、根据表拥有的记录和数据块数,实际上全表扫描要比索引扫描更快。
对第1种情况最常见的例子,是以下这样的count语句:
select count(*) from table_name;
在未作分析之前,它使用全表扫描,需要读取1000[假设的]多个数据块(假如一个数据块是8k),做了分析之后,使用的是INDEX (FAST FULL SCAN),可能只需要读取100个数据块。但是如果分析做得不好,也会导致Oracle不使用索引。
对第2种情况一般大家都认为通过索引访问比通过表访问要快,比较难理解的是在哪种情况下全表扫描要比索引扫描快。这就涉及到这么2个概念:
Oracle在评估使用索引的代价(cost)时有两个重要的数据:CF(Clustering factor) 和 FF(Filtering factor)。
CF: 所谓 CF, 可以理解为每读入一个索引块要对应读入多少个数据块。
FF: 所谓 FF, 就是SQL语句所选择的结果集占总的数据量的百分比。
一般的估算公式是:FF * (CF + 索引块个数) [备注:toms 说"the formula used by the CBO to compute the cost is blevel + FF * leaf_blocks + FF * clustering_factor"]由此估计出一个查询如果使用某个索引会需要读入的数据块块数。需要读入的数据块越多,则 cost 越大,Oracle 也就越有可能不选择使用 index。
(全表扫描需要读入的数据块数等于该表的实际数据块数)
其核心就是,CF可能会比实际的数据块数量大。CF受到索引中数据的排列方式影响,通常在索引刚建立时,索引中的记录与表中的记录有良好的对应关系,CF 都很小;在表经过大量的插入/修改操作后,这种对应关系越来越乱,CF也越来越大。这个时候就需要DBA重建该索引。
如果某个SQL语句以前一直使用某个索引,突然有一天,你发现系统慢的不行了,检查发现该SQL语句的某个索引用不上了:其中一个很大的可能就是 CF 已经变得太大,需要重新整理该索引了。
FF 则是Oracle 根据分析所做的估计。比如某表有50多万行,其主键的最小值是1,最大值是500000,考虑以下sql 语句:
Select * from table_name where keyid>=1; 和
Select * from table_name where keyid>=500000;
这两个表面看上去一样的sql语句,对Oracle而言却有巨大的差别。因为前者的FF是100%,而后者的FF可能只有 1%。如果它的CF大于实际的数据块数,则Oracle可能会选择完全不同的优化方式。
索引有很多种[参考  http://tomszrp.itpub.net/post/11835/59943 ],索引也有的“好坏”之分:
1、索引不是越多越好
特别是大量从来或者几乎不用的索引,对系统只有损害。OLTP系统每表超过5个索引即会降低性能。
2、很多时候,单列索引不如复合索引有效率。
3、用于多表连结的字段,加上索引会很有作用。
那么,在什么情况下单列索引不如复合索引有效率呢?有一种情况是显而易见的,那就是,当SQL语句所查询的列,全部都出现在复合索引中时,此时由于 Oracle 只需要查询索引块即可获得所有数据,当然比使用多个单列索引要快得多。

关于Oracle索引的一点认识相关推荐

  1. oracle索引与mysql区别_MySQL和Oracle中的唯一性索引从差别(r12笔记第83天)

    今天在修复MySQL数据的时候,发现一个看起来"奇怪"的问题. 有一个表里存在一个唯一性索引,这个索引包含3个列,这个唯一性索引的意义就是通过这3个列能够定位到具体1行的数据,但是 ...

  2. Oracle 索引扫描的五种类型

    之前在讨论CBO和RBO的时候提到了索引扫描的几种类型. Oracle Optimizer CBO RBO http://blog.csdn.net/tianlesoftware/archive/20 ...

  3. oracle 检查索引失效,oracle 索引失效原因_汇总

    1) 没有查询条件,或者查询条件没有建立索引 2) 在查询条件上没有使用引导列 3) 查询的数量是大表的大部分,应该是30%以上. 4) 索引本身失效 5) 查询条件使用函数在索引列上,或者对索引列进 ...

  4. oracle建立覆盖索引,oracle索引类型及扫描方式大整理

    oracle索引类型及扫描方式大整理 1. 存储类型 索引在各种关系型数据库系统中都是举足轻重的组成部分,其对于提高检索数据的速度起至关重要的作用.在Oracle中,索引基本分为以下几种:B*Tree ...

  5. 各种Oracle索引类型介绍

    各种Oracle索引类型介绍 逻辑上: Single column 单行索引 Concatenated 多行索引 Unique 唯一索引 NonUnique 非唯一索引 Function-based函 ...

  6. [转载]oracle索引的简单总结

    原文地址:oracle索引的简单总结作者:kindle 一.索引的概念: 数据库的索引类似于书籍的索引.在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息.在数据库中,索引也允许数据库程 ...

  7. 索引名 oracle,ORACLE 索引名称矫情

    oracle 索引英文名称很多,翻译过来的话也很多中文名称,不过总得来说词不达意.也就是说讲中文的时候,对方无法理解你说的是啥意思,啥情况,啥原理. 比如前缀,非前缀.本地和全局,普通和分区.B树和位 ...

  8. Oracle索引失效问题

    Oracle 索引不起作用的几种情况: 1,<> 2,单独的>,<,(有时会用到,有时不会) 3,like "%_" 百分号在前.(可采用在建立索引时用re ...

  9. oracle索引对模糊查询,Oracle索引

    一.Oracle索引原理 通俗易懂得讲,索引就是给每条记录建立了一个目录(索引), 每个建立的索引都是按照这个索引的字段去排序(实际未必是排序)存放, 然后按照索引字段去查询的时候,就先去查询索引,此 ...

最新文章

  1. Confluence 6 生产环境备份策略
  2. 得到当前日期前一天的零时零分零秒及当前日的零时零分零秒
  3. python调整数组顺序使奇数位于偶数前面
  4. STM32一种基于NTC的控温电路及软件实现
  5. Sendmail邮件服务器搭建与配置笔记
  6. STM32F103 PA8不能输出PWM波问题
  7. ESX4.1 “USB设备支持”实测
  8. 【小松教你手游开发】【游戏渲染】单色shader,纹理shader
  9. SurfaceView + MediaPlayer 实现列表循环播放视频
  10. h5+vue+php仿微信源码-泡泡IM
  11. acer软件保护卡怎么解除_Acer软件保护卡下载
  12. 借助创客匠人玩转视频号
  13. php动态网站实训心得体会,十天学会写PHP动态网站
  14. VMWare Fusion 8 序列号
  15. 微信小程序注册流程详解
  16. Java语言高级(第三部分)异常多线程 ->(个人学习记录笔记)
  17. EFS加密解密----重装系统后
  18. 腾讯地图发送定位-打开定位功能
  19. AirPods 2支持无限充电只要15分钟充满
  20. 华二紫竹2021年高考成绩查询,2019年华二紫竹升学数据分析!

热门文章

  1. 《C++ Primer Plus》(第6版)第3章编程练习
  2. 计算机f8键的功能,f8键有什么作用(图文)
  3. 【图解】什么是拥塞控制,这应该是把拥塞控制讲的最好的文章了
  4. python中#!含义
  5. Solr vs Elasticsearch vs Lucene
  6. python基于vue协同过滤算法的图书推荐系统
  7. latex 参考文献没有显示_LaTeX 参考文献的处理
  8. 简单三步快速远程桌面公司内网电脑【免费内网穿透】
  9. MySQL数据库中插入图片
  10. 电脑技巧 之 Discord翻译插件(PC端)(保姆级教程)