- 浏览: 254508 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (232)
- 瞎扯两句 (8)
- 操作系统 (5)
- 工作笔记 (33)
- 设计模式 (1)
- java (57)
- Java IDE (7)
- hibernate (17)
- oracle (46)
- ms sql (2)
- spring (9)
- struts2 (0)
- javascript (16)
- java_code (2)
- java之集合 (2)
- java之线程 (4)
- java之IO (4)
- java之虚拟机 (6)
- java之异常 (0)
- EJB (4)
- XML (4)
- 数据结构-算法 (2)
- 架构设计 (5)
- 配置信息 (2)
- 阅读笔记 (6)
- IT专业英语 (1)
- PI (0)
- 单元测试 (1)
最新评论
注意!!!
在较高版本的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量急剧下降。
上述语句从最消耗资源的语句列表中消失。
在较高版本的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量急剧下降。
上述语句从最消耗资源的语句列表中消失。
发表评论
-
oracle sql优化
2013-09-23 14:29 6581.绑定变量 不适用在OLAP系统中。 因为在OLAP中, ... -
阅读笔记 SQL
2013-08-14 18:24 830Start with...Connect By子句递归查询一般 ... -
oracle 锁 分析
2013-06-18 10:57 4791. 分为 tx 和 tm 。 即 行级 和 表级 其中 ... -
Oracle的TX锁(行级锁、事务锁)
2013-06-18 10:04 939问题:如何使用事务? ... -
mysql 时间戳自动更新
2013-04-09 10:24 983-- Table "pnodetail" ... -
阅读笔记
2013-02-07 17:24 431. 在OLTP系统装要注意sql的硬解析,但是在OLA ... -
synonym
2013-02-07 16:58 955建立一个同义词可以排除一个对象名字的限制. 如果你的数据库有多 ... -
oracle schema
2013-02-07 16:50 765A schema is a collection of dat ... -
物化视图的使用分析
2013-02-05 17:27 7861. 在 深入浅出 系列中,作者列举了一个例子来说明。 ... -
Oracle编程艺术阅读笔记-2
2013-01-29 10:40 7771. 位图索引。 不 ... -
Oracle:位图索引与死锁-2
2013-01-28 18:24 836位图索引被存储为压缩的索引值,其中包含了一个范围内的ROWID ... -
Oracle:位图索引与死锁-1
2013-01-28 18:04 869B 树索引更适合索引动态表的 OLTP 环境,而位图索引更适合 ... -
Oracle编程艺术阅读笔记-1
2013-01-24 18:48 8701. 绑定变量。 不使用会产生的影响: 每次运 ... -
JAVA完全控制Oracle中BLOB、CLOB说明
2012-12-28 17:07 852网络上很多关于JAVA对Oracle中BLOB、CLOB类型字 ... -
H2数据库的使用
2012-12-13 18:40 7731.下载h2的jar,例如h2-1.3.170.jar 2.c ... -
JTA
2012-12-05 17:35 976要理解 JTA 的实现原理 ... -
oracle 体系结构
2012-12-03 23:13 721[img][/img] oracle工作原理 ... -
oracle 存储过程实例-4
2012-12-03 23:04 542--错误处理部分。 --自 ... -
oracle 存储过程实例-4
2012-12-03 23:02 845--错误处理部分。 --自定义异常处理 CREATE OR ... -
oracle 存储过程实例-3
2012-12-03 21:42 815PROCEDURE autoissuereturns ( ...
相关推荐
创建复合索引的方式与创建单一索引相同,但复合索引的优势在于,当查询条件涉及多列且满足索引顺序时,它可以避免全表扫描,直接从索引中获取数据,这被称为覆盖式查询,查询效率显著提高。 窄索引是指索引列数较少...
在问题描述的示例中,我们有一个包含两列(A和B)的复合索引IX_TEST(A,B)。如果A列没有空值,但B列允许空值,那么在计算如`min(B)`这样的聚合函数时,Oracle可能不会使用这个复合索引。原因是,由于B列可以为空,...
为了解决这个问题,我们可以创建一个复合索引,如`db.students.createIndex({name: 1, age: 1})`,这将按`name`升序,然后按`age`升序的方式对文档进行索引。这样,当执行多键查询时,MongoDB可以一次性利用索引来...
但需注意,复合索引的顺序很重要,应将最常用于WHERE子句的列放在前面。 3. **覆盖索引**:如果索引包含了查询所需的所有列,那么这个索引被称为覆盖索引。使用覆盖索引,数据库可以直接从索引中获取数据,无需回表...
3. **合理使用复合索引**:对于复合查询,可以考虑建立包含多个列的复合索引。在设计复合索引时,应将最常用的查询列放在前面。 4. **定期维护索引**:随着时间的推移,索引可能会变得不再高效。定期重建索引或对其...
在查询时,应尽量使查询条件与索引顺序一致,以充分利用索引。对于复合索引,如果只使用起始列,性能接近使用所有列,而只使用非起始列则无效。如果所有列都被用到并且查询结果少,可以实现“索引覆盖”,达到最佳...
选择合适的复合索引列顺序对于查询性能至关重要。 索引的创建、维护和优化是数据库管理员的重要任务。创建索引可以显著提高查询速度,但也会占用额外的存储空间,并可能导致插入、更新和删除操作变慢,因为这些操作...
- 通常应根据查询条件的频率和数据分布来选择复合索引的列。 6. 索引的选择性: - 选择性越高,索引效率越好。一个列的唯一值越多,选择性越高。 - 对于区分度低的列(如性别或地区),创建索引可能效果不佳。 ...
MySQL支持五种主要类型的索引,分别是普通索引、主键索引、唯一索引、复合索引以及全文索引。 1. 普通索引:这是最基本的索引类型,无特殊要求,用于加速查询。例如,我们可以使用`CREATE INDEX`或`ALTER TABLE`...
聚簇索引是指数据表中记录的物理存储顺序和索引顺序完全一致,当插入新记录时,系统会将其索引值插入到索引页的适当位置,并将其数据插入到数据页的适当位置,而非聚簇索引则不影响记录的物理存储位置,索引完全独立...
- **复合索引**:可以同时基于多个列创建索引,称为复合索引。复合索引不仅可以基于同一表中的不同列创建,还可以创建复合的聚簇索引。例如,如果需要根据“姓”和“名”两个字段一起查询,可以创建一个包含这两个...
Oracle 索引详解 Oracle 索引是数据库性能优化的重要工具,它可以大大加快数据的检索速度,提高系统的性能。但是,索引也存在一些缺陷,例如创建索引和维护索引要耗费时间,索引需要占物理空间,等等。在本文中,...
当查询条件同时包含这两个字段时,复合索引可以大大减少需要扫描的数据量。 #### 五、索引的维护与管理 - **索引重建**:定期对索引进行重建可以提高其性能。 - **索引统计信息更新**:更新索引统计信息可以帮助...
然而,即使是在复合索引中,如果查询条件中只包含了索引的前几列,索引仍然能够被有效利用,但前提是这些前几列具有足够的选择性。 ### 4. 单字段索引的使用 对于单一字段的查询,如果字段上存在索引,那么索引将...
复合索引的顺序很重要,因为它是左前缀匹配原则,即索引会按照列的顺序从左到右进行匹配。 此外,还有唯一索引(UNIQUE INDEX)和主键索引。唯一索引确保索引中的每一项都是唯一的,但允许有NULL值。主键索引则是表...
根据索引的组织方式和存储结构,索引可以分为聚集索引、非聚集索引、唯一索引和复合索引等。 * 聚集索引:将表中的记录在物理数据页中的位置按索引字段值重新排序,再将重排后的结果写回到磁盘上。每个表只能有一个...
- 当查询涉及到多个字段时,创建复合索引可以更有效地满足查询需求。这意味着索引包含多个列,按照它们在查询中出现的顺序排列。 3. **系统工具的利用**: - 如Informix的`tbcheck`工具可以用来检查和修复索引的...
8. **复合索引**:如果一个查询涉及多个列,可以创建复合索引,注意列的顺序很重要,应将选择性高的列放在前面。 9. **索引优化**:定期分析`EXPLAIN`计划,检查索引的使用情况,优化查询语句或调整索引策略。 此外...