设为首页 收藏本站
查看: 955|回复: 0

[经验分享] 索引优化原则及Oracle中索引总结

[复制链接]

尚未签到

发表于 2017-12-10 21:20:46 | 显示全部楼层 |阅读模式
  索引建立原则

  • 确定针对该表的操作是大量的查询操作还是大量的增删改操作。
  • 尝试建立索引来帮助特定的查询。检查自己的sql语句,为那些频繁在where子句中出现的字段建立索引。
  • where语句中不得不对查询列采用函数查询,如upper函数,最好建立相应函数索引;
  • 在SQL语句中经常进行GROUP BY、ORDER BY的字段上建立索引
  • 用于联接的列(主健/外健)上建立索引;
  • 在经常存取的多个列上建立复合索引,但要注意复合索引的建立顺序要按照使用的频度来确定;
  • 尝试建立复合索引来进一步提高系统性能。修改复合索引将消耗更长时间,同时,复合索引也占磁盘空间。
  • 对于小型的表,建立索引可能会影响性能
  • 在不同值较少的字段上不必要建立索引,如性别字段;
  • 应该避免对具有较少值的字段进行索引。???
  • 避免选择大型数据类型的列作为索引。
  • 缺省情况下建立的是非簇集索引,但在以下情况下最好考虑簇集索引,如:含有有限数目(不是很少)唯一的列;进行大范围的查询;
  • 充分的利用索引可以减少表扫描I/0的次数,有效的避免对整表的搜索。当然合理的索引要建立在对各种查询的分析和预测中
  • 避免在有大量并发DML运算的表中使用Bitmap索引;
  • 经常被更新,或者一个表虽然很大,但是如果多数查询返回结果都超过表中总行数的4%,那么一般认为也是不宜建立索引的。
  • 经常查询的记录数目少于表中所有记录总数的5%时就应当创建索引
  • 存储索引的表空间最好单独设定
  • 随着数据的变化,索引的效率会下降,因此应定期重建索引
  oracle位图索引  B-树索引
  B-树索引在Oracle中是一个通用的索引,在创建索引时它就是默认的索引类型。最多可以包括32列。
  创建语句:create index indexName on tableName(columnName);
  特点:
  1.索引不存储null值。更准确的说,单列索引不存储null值,复合索引不存储全为Null的值。索引不能存储Null,所以对这列采用is null条件时,因为索引上根本没Null值,不能利用到索引,只能全表扫描。
  2.不适合键值较少的列。与数据块有关。
  3.前导模糊查询不能利用索引(like '%XX'或者like '%XX%')。这样会导致全表扫描。
  位图索引Oracle为每个唯一键创建一个位图,然后把与键值所关联的ROWID保存为位图。最多可以包括30列。
  创建语句:create bitmap index indexName on tableName(columnName);
  特点:
  1.相对于B*Tree索引,占用的空间非常小,创建和使用非常快。位图索引由于只存储键值的起止Rowid和位图,占用的空间非常少。
  2.不适合键值较多的列。
  3.不适合update、insert、delete频繁的列。
  4.可以存储null值。B*Tree索引由于不记录空值,当基于is null的查询时,会使用全表扫描,而对位图索引列进行is null查询时,则可以使用索引。
  5.当select count(XX) 时,可以直接访问索引中一个位图就快速得出统计数据。
  6.当根据键值做and,or或 in(x,y,..)查询时,直接用索引的位图进行或运算,快速得出结果行数据。
  位图索引有很多限制:
  基于规则的优化器不会考虑位图索引
  当执行ATLER TABLE语句,并修改包含有位图索引的列时,会使位图索引失效
  位图索引在索引块中储存了索引键的值;然而,他们并不能用户任何类型的完整性检查
  位图索引不能被申明为唯一索引
  索引不会被命中的情况
  1、查询谓词没有使用索引的主要边界,可能会导致不走索引。
  查询:SELECT * FROM T WHERE Y=XXX;
  假如T表上有一个包含Y值的组合索引,但是优化器会认为需要一行行的扫描会更有效,这个时候,优化器可能会选择TABLE ACCESS FULL,
  查询换成:SELECT Y FROM T WHERE Y = XXX,优化器会直接去索引中找到Y的值,因为从B树中就可以找相应的值。
  2、如果在B树索引中有一个空值的时候,优化器可能不会走索引。
  查询:那么查询诸如SELECT COUNT(*) FROM T
  有两种方式可以让索引有效,一种是SELECT COUNT(*) FROM T WHERE XXX IS NOT NULL或者是不能为空。
  3、在索引字段上使用函数,导致不会走索引。
  查询:SELECT * FROM T WHERE FUN(Y) = XXX。
  如果在T表上有一个索引Y时,索引也不会被用到,因为你要查询的列中所有的行都需要被计算一遍,

  可以在这个表上建立一个基于函数的索引,比如CREATE INDEX>  4、索引不适用于隐式转换的情况。
  查询:SELECT * FROM T WHERE Y = 5
  在Y上面有一个索引,但是Y列是VARCHAR2的,那么Oracle会将上面的5进行一个隐式的转换成SELECT * FROM T WHERE TO_NUMBER(Y) = 5,这个时候也是有可能用不到索引的。
  5、如果表只有几个数据块大小,而且可以被Oracle一次性抓取,那么就没有使用索引的必要了,因为抓取索引还需要去根据rowid从数据块中获取相应的元素值,因此在表特别小的情况下,索引没有用到是情理当中的事情。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-422784-1-1.html 上篇帖子: Oracle number类型查询精度丢失的解决方法 下篇帖子: oracle in 多个字段
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表