Oracle优化
1. 索引
概念:在oracle中,索引是一种供服务器在表中快速查找一个行的数据库结构,可以理解为一本书的目录,索引是一种数据库对象,其存储也是需要磁盘开销的,因此,如果数据量越大,那么存储索引的空间也就越大。
优势:可以提高检索数据的效率,通常情况下通过索引查询数据比全表扫描要快,索引可以告诉oracle优化器将查询的数据按照执行计划进行,在多表关联的时候,索引的使用也可以大大提升关联表的效率。
劣势:虽然使用索引可以大大提升查询的效率,但是因为索引也是需要空间来进行存储,因此也需要定期维护,每当有记录在表中进行了增删改或者索引列被修改时,索引本身也会被修改,也就是说数据库会自动维护索引,这样如果频繁的进行增删改操作,那么对磁盘的IO是一个极大的挑战,时间长了会产生索引碎片,也会大大的影响表的查询效率。
2. 索引的分类
①B-tree索引:oracle默认的索引类型,内部采用二叉树结构,根据rowid实现访问行的快速定位,这种索引是oracle数据库中最常用的一种索引模式。
②位图索引:通过使用位图,标识被索引的列值,这种索引经常应用于olap系统中,几乎不会出现在oltp系统中,应用场景如:列值中存有男女,有大量重复,而又经常使用该列进行数据过滤的时候。
③函数索引:通过函数将数据列计算的值返回作为索引键值建立的索引结构。
3. 使用索引的注意事项
①避免在索引列上使用not,当出现not时,它就会停止使用索引转而进行全表扫描。
②避免在索引列上使用计算,如果索引列中使用了计算,例如sal*10>=100,那么sal列如果有索引也不会有效果,应改为:sal>=10。
③避免在索引列上使用null或者是is not null:索引在存储的时候不存储null值。对与单列索引来讲,如果该列包含空值,那么空值将不会被记录,对于复合索引来讲,如果复合索引列的每列都是空,那么索引也不会记录,因为索引不记录空值,因此,where子句中对索引列进行空值比较将使oracle停用该索引。
④避免使用通配符%%:在where条件中如果使用了where colum like ‘%ab%’,那么也会停用索引。
⑤索引列上避免使用函数:当不同的数据类型进行比较时,oracle自动对列进行简单的类型转换,例如 where a = 100,如果a的字符类型是varchar 那么,oracle会自动对100 转换为varchar类型,如果使用了where to_number(a) = 100,那么索引也将失去作用。
4. 索引使用的场景
①如果一个表中的数据量超过30%是重复的数据时,使用索引没有显著的效率提升,因此一般建立索引的一个原则就是重复数据不能超过10%。
②如果一列中存在大量的重复值,而该列在实际查询中又经常出现在where子句中,那么就适用建立位图索引。位图索引的使用一般出现在olap系统中。
③函数索引的应用场景就是将计算列的值返回给oracle,比如类型转换的时候,将varchar转换为number类型,这种场景可以使用函数索引来提升效率。
总结
Oracle的分享就到这儿了,由于King的个人能力限制,以及当前大环境影响,oracle的课程今天就结束了,当然,其中有些东西分享的还是比较粗糙的,也希望大家不吝赐教,也非常希望大家能够加我的qq:156937648,大家一起学习探讨。从下周开始,King将与大家分享hadoop生态圈的搭建以及学习,希望大家持续关注,同时也希望大家加入我,下周见。




