`

(转)oracle复合索引介绍(多字段索引)

 
阅读更多

oracle普通索引介绍(单字段索引) : http://ysj5125094.iteye.com/blog/1745354

 

      首先,在大多数情况下,复合索引比单字段索引好.以税务系统的SB_ZSXX(申报类_征收信息表)为例,该表为税务系统最大的交易表.如果分别按纳税人识别号,税务机关代码,月份3个字段查询,每个字段在该表中的可选性或约束性都不强,如一个纳税人识别号有很多纳税记录,一个税务机关代码和同一月份记录就更多了,所以3个字段合起来,"某个纳税人识别号+某个税务机关代码+某月"的记录就少多了.因此复合索引比单字段索引的效率高多了.很多系统就是靠新建一些合适的复合索引,使效率大幅度提高.

      但是,复合索引比单字段索引的内容原理复杂,复合索引有两个重要原则需要把握: 前缀性和可选性.如果糊里糊涂的滥用复合索引,效果适得其反.

     

以例子来说明,例子如下:

      假设在员工表(emp)的(ename,job,mgr)3个字段上建了一个索引,例如索引名叫idx_1.3个字段分别为员工姓名,工作和所属经理号.然后,写如下一个查询语句,并不断进行查询条件和次序的排列组合,例如:

Sql代码  收藏代码
  1. select * from emp where ename = 'a' and job = 'b' and mgr = 3 ;  
  2. select * from emp where job = 'b' and ename = 'a' and mgr = 3 ;  
  3. select * from emp where mgr = 3 and ename = 'a' and job = 'b' ;  
  4. select * from emp where mgr = 3 and job = 'b' and ename = 'a' ;  
  5. select * from emp where job = 'b' and mgr = 3 and ename = 'a' ;  
  6. .....  

回答问题:在各种条件组合情况下,刚才建的索引(idx_1) 是用还是不用?也就是说对emp表的访问是全表扫描还是按索引(idx_1)访问?

 

答案是 :  上述语句中只要有ename='a'条件,就能用上索引(ind_1),而不是全表扫描(这就是复合索引的前缀性).

 

 

复合索引的原理和设计建议

 

1.复合索引的第一个建议: 前缀性(Prefixing)

     先从例子说起.假设省,市,县分别用3个字段存储数据,并建立了一个复合索引.请记住: oracle索引,包括复合索引都是排序的.例如该复合索引在数据库索引树上是这样排序的,即先按省排序,再按市排序,最后按县排序:

省  市  县
北京  北京  东城
北京  北京  西城
北京  北京  海淀
... ...
黑龙江  哈尔滨  道里区
黑龙江  哈尔滨  道外区
黑龙江  哈尔滨  香坊区
... ...
黑龙江  齐齐哈尔 龙沙区
黑龙江  齐齐哈尔 铁锋区
黑龙江  齐齐哈尔 富拉尔基区
... ...
湖南  长沙  芙蓉区
湖南  长沙  岳路区
湖南  长沙  开福区
... ...

 

oracle不是智能的,它只会按图索骥,该索引结构是先按省排序的,所以只要给出省名,就能使用索引.如果没有省名,oracle就成了无头苍蝇,乱找一气,变成了全表扫描了.例如,如果你只给一个县条件,如"开福区",oracle肯定不会使用该索引了.

 

2.关于skip scan index

有时候复合索引第一个字段没有在语句中出现,oralce也会使用该索引.对,这叫oralce的skip scan index功能,oracle 9i才提供的.

skip scan index功能适合于什么情况呢?如果oracle发现第一个字段值很少的情况下,例如假设emp表有gender(性别)字段,并且建立了(gender,ename,job,mgr)复合索引.因为性别只有男和女,所以为了提高索引的利用率,oracle可将这个索引拆成('男',ename,job,mgr),('女',ename,job,mgr)两个复合索引.这样即便没有gender条件,oracle也会分别到男索引树和女索引树进行搜索.

但是,(gender,ename,job,mgr)索引本身设计是不合理的,它违背了复合索引的第二个原理,可选性(Selectivity),见下面描述.

 

3.复合索引的第二个原理:可选性(Selectivity)

您可能会问:复合索引中如何排序字段顺序?这时就要用到复合索引的第二个原理:可选性(Selectivity)规则.oracle建议按字段可选性高低进行排序,即字段值多的排在前面.例如,(ename,job,mgr,gender),(县,市,省).这是因为,字段值多,可选性越强,定位的记录越少,查询效率越高.例如,全国可能只有一个"开福区",而湖南省的记录则太多了.

 

4.复合索引设计建议

(1).分析SQL语句中的约束条件字段.

(2).如果约束条件字段比较固定,则优先考虑创建针对多字段的普通B*树复合索引.如果同时涉及到月份,纳税人识别号,税务机关代码3个字段的条件,则可以考虑建立一个复合索引.

(3).如果单字段是主键或唯一字段,或者可选性非常高的字段,尽管约束条件比较固定,也不一定要建成复合索引,可建成单字段索引,降低复合索引开销.

(4).在复合索引设计中,需首先考虑复合索引的第一个设计原理:复合索引的前缀性.即在SQL语句中,只有将复合索引的第一个字段作为约束条件,该复合索引才会启用.

(5).在复合索引设计中,其实应考虑复合索引的可选性.即按可选性高低,进行复合索引字段的排序.例如上述索引的字段排序顺序为:纳税人识别号,税务机关代码,月份.

(6).如果条件涉及的字段不固定,组合比较灵活,则分别为月份,税务机关代码和纳税人识别号3个字段建立索引.

(7).如果是多表连接SQL语句,注意是否可以在被驱动表(drived table)的连接字段与该表的其他约束条件字段上创建复合索引.

(8).通过多种SQL分析工具,分析执行计划以量化形式评估效果.

分享到:
评论

相关推荐

    数据库 创建索引 sql oracle

    * 复合索引:对表创建的索引是基于多个字段对表中的记录排序的。 索引的创建 ------------ 创建索引可以使用 Enterprise Manager、Transact-SQL 语句和索引优化向导等方法。 * 用 Enterprise Manager 创建索引:...

    oracle约束和索引笔记

    - **复合索引(Composite Index)**: 包含多个列的索引,按列的顺序排列,对于包含这些列的查询非常有效。 **使用和维护索引的注意事项:** - 索引会占用额外的存储空间,并且在插入、删除和更新数据时需要维护,...

    Oracle复合索引与空值的索引使用问题小结

    Oracle数据库在处理复合索引和空值时的行为是SQL优化中的一个重要知识点,特别是对于大型数据库系统来说,理解这些细节能够显著提升查询效率。本文将详细探讨Oracle如何处理含有空值的复合索引以及非空约束对索引...

    ORacle 全文索引

    2. 索引策略:根据查询需求选择合适的索引策略,如单字段索引、多字段索引或复合索引。 3. 分区索引:对于大型表,可以考虑使用分区索引来提高全文搜索效率。 六、全文索引的安全和权限 1. 权限管理:Oracle允许对...

    Oracle数据库表建立字段唯一性的方法

    - 如果需要确保多个字段的组合是唯一的,可以创建一个基于这些字段的复合唯一约束或索引。 6. **性能考虑** - 唯一约束在插入、更新和删除操作时会进行实时检查,可能会降低性能。而唯一索引则在查询时提供更快的...

    oracle分区与索引

    #### 二、Oracle 索引介绍 索引是用于快速查找表中数据的一种数据结构。Oracle提供了多种类型的索引,每种类型都有其适用场景。 ##### 1. 常见索引类型 - **B树索引**:最常见的索引类型,适用于各种查询场景。 -...

    ORACLE索引笔记.pdf

    但如果查询条件需要,可以在已有的单字段索引上添加新的复合索引。 8. **监控与分析**:利用Oracle的分析工具(如EXPLAIN PLAN)来评估索引设计是否合理,根据执行计划调整索引策略。 总之,Oracle索引设计是一个...

    oracle索引失效的总结

    例如,使用`SUBSTR`, `DECODE`, `INSTR`等函数来处理索引字段。 **解决办法**: - 尝试重构SQL语句,避免在索引列上使用这些函数。 - 如果无法避免使用这些函数,可以考虑创建一个函数索引(Function-Based Index)来...

    Oracle数据库中的索引管理技术.pdf

    (3)两列比一列好:Oracle 允许用户建立复合索引,这种索引针对多个表列。 (4)where 子句和索引:Oracle 根据用户在 where 子句中的定义找出满足查询要求的索引项(如根据一条 SQL 语句中的 where 和 and 部分...

    oracle 索引

    4. 考虑复合索引:对于多个列的查询,可以创建复合索引来提高查询性能。 总之,Oracle索引是优化数据库性能的重要工具。理解索引的工作原理、类型和管理方法,有助于我们更有效地设计和使用索引,从而提升数据库...

    Oracle数据库查询优化的方法

    同时,如果复合索引中的字段经常单独出现在WHERE子句中,那么将复合索引分解为多个单字段索引可能更为合适。另外,如果已经存在单字段索引,同时也有包含这些字段的复合索引时,一般可以考虑删除复合索引,以减少...

    索引优化原则及Oracle中索引总结

    Oracle索引建立原则  · 确定针对该表的操作...  · 在经常存取的多个列上建立复合索引,但要注意复合索引的建立顺序要按照使用的频度来确定;  · 尝试建立复合索引来进一步提高系统性能。修改复合索引将消耗更长

    提高查询效率的oracle索引优化策略探析.pdf

    复合索引在单字段索引效率较低时才有价值,但频繁更新的表应谨慎使用,因为它们可能降低写操作性能。 2. **避免全表扫描**:使用函数索引(Function-based Index, FBI)可以显著提高特定查询的速度,且在更新未涉及...

    Oracle 编程与优化PPT【华为内部培训资料】

    10. 如果复合索引中的字段经常单独被查询,应分解为多个单字段索引。 11. 复合索引的字段超过3个时,需要评估其必要性,可能需要减少字段数量。 12. 若已有单字段索引和相同字段的复合索引,通常可以删除复合索引。 ...

    Oracle优化器介绍

    Oracle 优化器介绍 Oracle 优化器是 Oracle 数据库中的一种核心组件,负责生成执行计划,以提高 SQL 语句的执行效率。 Oracle 优化器可以分为两大类:基于规则的优化器(RBO)和基于成本的优化器(CBO)。 基于...

    培训教程之Oracle索引详解PPT教案学习.pptx

    1. **单列索引和复合索引**:单列索引是基于单一列创建的,而复合索引则由两个或更多列组成。复合索引可以优化涉及多列的查询,特别是当查询条件包括多列时。 2. **B树索引**:这是Oracle中最常见的索引类型,也是...

    Oracle Index索引无效的原因与解决方法

    5. **组合索引**:对于复合索引,只有包含所有引导列的查询条件才会使用索引。如果只筛选组合索引中的部分列,那么索引可能不会被充分利用。应确保WHERE子句中的条件至少包含组合索引的引导列。 在分析索引使用情况...

    Oracle表分区和索引分区

    ### Oracle表分区与索引分区详解 #### 一、Oracle表分区概述 Oracle表分区是一种高级数据组织技术,主要用于提高大型表(特别是TB级别的数据仓库)的管理效率和查询性能。自Oracle 8版本起,引入了分区特性,通过...

    关于数据库索引的理解(实践总结)

    复合索引适合于查询条件经常同时包含多列的情况,而单独索引更适合于单独字段的频繁查询。此外,需要注意的是,虽然索引能提高查询性能,但也会占用额外的存储空间,并可能影响数据插入、更新和删除的性能,因为每次...

    oracle数据库索引失效

    8. 没有对复合索引的所有列进行分析,或者单独引用了复合索引的非首列。 9. 使用`NOT IN`或`NOT EXISTS`子句,这通常需要优化器进行复杂处理,可能导致不使用索引。 10. 当日期和时间类型的比较出现问题,如使用...

Global site tag (gtag.js) - Google Analytics