`

复合索引【复合索引顺序选择问题】

 
阅读更多
注意!!!
在较高版本的oracle中不存在下述的问题!!!


复合索引第一个原则:前缀性(Prefixing)

复合索引的前缀性是指只有当复合索引的第一个字段出现在SQL语句的谓词条件中时,该索引才会被用到。
如复合索引为(ename,job,mgr),只要谓词条件中出现第一个字段ename,就可以用复合索引,否则不会用。
唯一的例外是skip scan index,就是如果Oracle发现第一个字段的值很少,会自动拆分为两个复合索引。如复合索引(gender,ename,job,mgr),因为第一个字段gender只有两个值:男和女,因此Oracle会将这个索引拆分成('男',ename,job,mgr)和('女',ename,job,mgr)两个复合索引,这样即使gender没有出现在谓词条件中,也可以用该复合索引。


skip scan是Oracle针对特定条件上索引结构,所提供的一种备选搜索操作。Skip scan的使用不是规则,而是成本估算。Index Skip Scan是Oracle提供的一种执行计划操作,可以应用在执行计划的生成中。简单的说,就是Oracle将SQL描述语句转化为可执行操作序列(执行计划)过程中一个操作选择。



复合索引第二个规则:可选性(Selectivity)

Oracle建议复合索引应按字段可选性(即值的多少)的高低进行排列,这是因为,字段值越多,可选性越强,定位的记录就越少,查询效率就越高。




========================

我先从底层看起。好老的环境哦,还是Oracle 8.0.6。硬件配置还可以,IBM RS6000机器,4CPU/2G。你才上海一个区的数据嘛,才几个G,处理能力肯定没问题。再看数据库参数,乖乖,从未调过啊。这不相当于把奔驰车常年挂在一档开吗?调参数很简单,但Oracle 8.0.6需要重新启动,白天业务期间无法做。只好看应用了,当然也是我期待已久的。8.0.6在性能分析方面比较土,只能用蹩脚的utlbstat,utlestat脚本,或者直接去视图里分析。我当然不会象前面的洋‘忽悠’一样,去查询内部视图,况且我一个人呆在黑古隆冬的机房里,想做秀也没人看啊。还是那句话,发现问题并不难,难得是分析和解决问题。喏,以下就是当时在10:00多业务高峰时的一些最消耗资源的语句:



BEGIN htjs.FP_QMKCJZ_T(:1,:2,:3); END


SELECT COUNT(*) FROM HTJS.FP_QYLYC WHERE NSRSBH = :b1 AND YF = :2 AND SFLB != 'S';


SELECT FP_DM, QS_HM,FP_SL FROM HTJS.FP_QYLYC WHERE YF=:b1 and SFLB = 'S'  and FP_ZL = 's' and NSRSBH = :b2;


SELECT SWJG_DM,FP_DM,FP_QS_HM,FP_SL,SFLB   FROM HTJS.FP_SFD  WHERE TO_CHAR(SFRQ,'YYYYMM') = TO_CHAR(:b1)  AND NSRSBH = :b2  AND (SFLB = '12'  OR SFLB = '21' ) AND OLDFLAG = '0' ORDER BY ID;


SELECT MAX(BSYF)   FROM HTJS.CB_QY_BSQK_TJB  WHERE NSRSBH = :b1;



以上述第2,3条SQL语句为例,当时系统已经在HTJS.FP_QYLYC表的如下字段上按顺序建立了一个复合索引:



YF                     ----- 月份

SWJG_DM                ----- 税务机关_代码

NSRSBH                 ----- 纳税人识别号

FP_DM                  ----- 发票_代码

SFLB                   ----- 收费类别

QS_HM                  ----- XX_号码



看出问题了吧?虽然两条语句都含YF(月份)字段,符合前缀性原则,但Oracle实际上没有使用该索引,因为同一月份记录太多了,还不如全表扫描。更重要的是,该复合索引的字段顺序的设计上根本没有考虑各字段的可选性。于是,我当时新建了一个索引:create index ora_FP_QYLYC_2 on FP_QYLYC(NSRSBH ,YF,SFLB,FP_ZL) tablespace fpfs;

===========

效果评估:

前端应用软件反应速度由30秒下降为不足1秒。

CPU平均利用率由50%下降为5%。

I/O量急剧下降。

上述语句从最消耗资源的语句列表中消失。
分享到:
评论

相关推荐

    SQLServer的复合索引学习.docx

    创建复合索引的方式与创建单一索引相同,但复合索引的优势在于,当查询条件涉及多列且满足索引顺序时,它可以避免全表扫描,直接从索引中获取数据,这被称为覆盖式查询,查询效率显著提高。 窄索引是指索引列数较少...

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

    在问题描述的示例中,我们有一个包含两列(A和B)的复合索引IX_TEST(A,B)。如果A列没有空值,但B列允许空值,那么在计算如`min(B)`这样的聚合函数时,Oracle可能不会使用这个复合索引。原因是,由于B列可以为空,...

    深入理解MongoDB的复合索引

    为了解决这个问题,我们可以创建一个复合索引,如`db.students.createIndex({name: 1, age: 1})`,这将按`name`升序,然后按`age`升序的方式对文档进行索引。这样,当执行多键查询时,MongoDB可以一次性利用索引来...

    Mysql优化选择最佳索引的方法共2页.pdf.zip

    但需注意,复合索引的顺序很重要,应将最常用于WHERE子句的列放在前面。 3. **覆盖索引**:如果索引包含了查询所需的所有列,那么这个索引被称为覆盖索引。使用覆盖索引,数据库可以直接从索引中获取数据,无需回表...

    索引介绍聚集索引和非聚集索引

    3. **合理使用复合索引**:对于复合查询,可以考虑建立包含多个列的复合索引。在设计复合索引时,应将最常用的查询列放在前面。 4. **定期维护索引**:随着时间的推移,索引可能会变得不再高效。定期重建索引或对其...

    ORACLE索引笔记.pdf

    在查询时,应尽量使查询条件与索引顺序一致,以充分利用索引。对于复合索引,如果只使用起始列,性能接近使用所有列,而只使用非起始列则无效。如果所有列都被用到并且查询结果少,可以实现“索引覆盖”,达到最佳...

    Oracle 索引

    选择合适的复合索引列顺序对于查询性能至关重要。 索引的创建、维护和优化是数据库管理员的重要任务。创建索引可以显著提高查询速度,但也会占用额外的存储空间,并可能导致插入、更新和删除操作变慢,因为这些操作...

    MySQL索引 使用笔记

    - 通常应根据查询条件的频率和数据分布来选择复合索引的列。 6. 索引的选择性: - 选择性越高,索引效率越好。一个列的唯一值越多,选择性越高。 - 对于区分度低的列(如性别或地区),创建索引可能效果不佳。 ...

    Mysql数据库索引创建、索引删除、索引失效场景详解

    MySQL支持五种主要类型的索引,分别是普通索引、主键索引、唯一索引、复合索引以及全文索引。 1. 普通索引:这是最基本的索引类型,无特殊要求,用于加速查询。例如,我们可以使用`CREATE INDEX`或`ALTER TABLE`...

    关于SQL Server与VFP索引的研究.pdf

    聚簇索引是指数据表中记录的物理存储顺序和索引顺序完全一致,当插入新记录时,系统会将其索引值插入到索引页的适当位置,并将其数据插入到数据页的适当位置,而非聚簇索引则不影响记录的物理存储位置,索引完全独立...

    SQL SERVER建立索引.pdf

    - **复合索引**:可以同时基于多个列创建索引,称为复合索引。复合索引不仅可以基于同一表中的不同列创建,还可以创建复合的聚簇索引。例如,如果需要根据“姓”和“名”两个字段一起查询,可以创建一个包含这两个...

    Oracle 索引 详解

    Oracle 索引详解 Oracle 索引是数据库性能优化的重要工具,它可以大大加快数据的检索速度,提高系统的性能。但是,索引也存在一些缺陷,例如创建索引和维护索引要耗费时间,索引需要占物理空间,等等。在本文中,...

    关于数据库中的索引原理

    当查询条件同时包含这两个字段时,复合索引可以大大减少需要扫描的数据量。 #### 五、索引的维护与管理 - **索引重建**:定期对索引进行重建可以提高其性能。 - **索引统计信息更新**:更新索引统计信息可以帮助...

    索引使用规则.txt

    然而,即使是在复合索引中,如果查询条件中只包含了索引的前几列,索引仍然能够被有效利用,但前提是这些前几列具有足够的选择性。 ### 4. 单字段索引的使用 对于单一字段的查询,如果字段上存在索引,那么索引将...

    索引

    复合索引的顺序很重要,因为它是左前缀匹配原则,即索引会按照列的顺序从左到右进行匹配。 此外,还有唯一索引(UNIQUE INDEX)和主键索引。唯一索引确保索引中的每一项都是唯一的,但允许有NULL值。主键索引则是表...

    数据库 创建索引 sql oracle

    根据索引的组织方式和存储结构,索引可以分为聚集索引、非聚集索引、唯一索引和复合索引等。 * 聚集索引:将表中的记录在物理数据页中的位置按索引字段值重新排序,再将重排后的结果写回到磁盘上。每个表只能有一个...

    合理使用索引技巧

    - 当查询涉及到多个字段时,创建复合索引可以更有效地满足查询需求。这意味着索引包含多个列,按照它们在查询中出现的顺序排列。 3. **系统工具的利用**: - 如Informix的`tbcheck`工具可以用来检查和修复索引的...

    mysql面试题,以及经典的索引问题详解

    8. **复合索引**:如果一个查询涉及多个列,可以创建复合索引,注意列的顺序很重要,应将选择性高的列放在前面。 9. **索引优化**:定期分析`EXPLAIN`计划,检查索引的使用情况,优化查询语句或调整索引策略。 此外...

Global site tag (gtag.js) - Google Analytics