今天主要介绍Oracle数据库的三大索引类型,仅供参考。一、B-Tree索引的三大特点:高度低、存储列值、结构有序1、利用索引特性优化外键索引:不仅可以提高查询效率,还可以有效避免锁竞争(外键的delete表中记录不提交,主键所在表将被锁定)。统计查询SQL:count()、avg()、sum()、max()、min()排序操作:按字段索引排序去重操作:distinctUNION/UNIONALL:unionall不需要去重,不需要排序2、联合索引应用场景一:SQL查询列少,建立查询列联合索引可以有效消除回表,但一般3个以上字段的联合索引不适合。应用场景2:A字段返回的记录多,B字段返回的记录多,同时查询A和B字段返回的记录很少。例如执行下面的查询时,有很多c1和c2结果,但很少有c3。selectcount(1)c1fromtwhereA=1;selectcount(1)c2fromtwhereB=2;selectcount(1)c3fromtwhereA=1andB=2;谁是联合索引的第一列?一个流行的观点:把重复记录少的字段放在前面,重复记录多的放在后面,其实这样的结论是不准确的。droptabletpurge;createtabletasselect*fromdba_objects;createindexidx1_object_idont(object_id,object_type);createindexidx2_object_idont(object_type,object_id);等值查询:select*fromtwhereobject_id=20andobject_type='TABLE';select/*+index(t,idx1_object_id)*/*fromtwhereobject_id=20andobject_type='TABLE';select/*+index(t,idx2_object_id)*/*fromtwhereobject_id=20andobject_type='TABLE';结论:在等值查询的情况下,无论组合索引的哪一列在前面,性能都是一样的。范围查询:select*fromtwhereobject_id>=20andobject_id<2000andobject_type='TABLE';select/*+index(t,idx1_object_id)*/*fromtwhereobject_id>=20andobject_id<2000andobject_type='TABLE';select/*+index(t,idx2)_object_*/*fromtwhereobject_id>=20andobject_id<2000andobject_type='TABLE';结论:对于组合索引的列,等价查询列在最前面,范围查询列在最后。但是在实际生产环境中如果要确定复合索引列中谁排在第一位,则必须综合考虑所有普通SQL中索引的使用,因为索引过多会影响存储性能。3、索引的危害表上索引过多会严重影响插入性能;对于删除操作,删除少量数据索引可以有效快速定位,提高删除效率,但如果删除大量数据,则会产生负面影响;类似于更新操作删除,如果更新是非索引列则无效。4、索引监控--monitoralterindex[index_name]monitoringusage;select*fromv$object_usage;--取消监控:alterindex[index_name]nomonitoringusage;根据索引监控的结果,可以考虑删除长期不用的索引。5、索引常用执行计划INDEXFULLSCAN:索引全扫描,单块读,有序INDEXRANGESCAN:索引范围扫描INDEXFASTFULLSCAN:索引快速全扫描,多块读,无序INDEXFULLSCAN(MIN/MAX):查询MAX()和MIN()函数INDEXSKIPSCAN:查询条件不使用复合索引的第一列,但当复合索引的第一列重复度较高时,第二个可能用到的列,位图索引应用场景:表的更新操作很少,重复度高的列。优点:count(*)效率高createtablet(name_id,gendernotnull,locationnotnull,age_rangenotnull,data)asseselectrownum,decode(floor(dbms_random.value(0,2)),0,'M',1,'F')gender,ceil(dbms_random.value(0,50))location,decode(floor(dbms_random.value(0,4)),0,'child',1,'young',2,'middle',3,'old')age_range,rpad('*',20,'*')datafromdualconnectbyrownum<=100000;createindexidx_tont(性别,位置,age_range);createbitmapindexgender_idxont(性别);createbitmapindexlocation_idxont(位置);'andlocationin(1,10,30)andage_range='child';select/*+index(t,idx_t)*/*fromtwheregender='M'andlocationin(1,10,30)andage_range='child';3.函数索引应用场景:需要对某列进行函数操作的场景。使用函数索引比使用普通索引效率低。oracle中创建函数索引就是根据你使用的函数创建函数索引,比如substrselect*fromtablewhere11=1andsubstr(field,0,2)in('01')创建索引语句是createindexindexnameontable(substr(fileld,0,2))在线无日志记录;
