- 浏览: 1730831 次
- 性别:
- 来自: 沈阳
文章分类
- 全部博客 (288)
- java (59)
- javaweb (15)
- eclipse (16)
- uml (1)
- java ee (7)
- windows (5)
- html (4)
- 数据结构和算法 (6)
- oracle (84)
- struts (3)
- ajax (3)
- hibernate (3)
- spring (12)
- ExtJS (14)
- 随笔 (2)
- JavaScript (9)
- PL SQL (12)
- tomcat (2)
- Plugins (5)
- office (2)
- webService (4)
- others (9)
- htc (1)
- 自定义标签的行为 (1)
- powerDesigner (3)
- webSphere (5)
- linux (6)
- dom4j (1)
- xml (5)
- json (2)
- bat (4)
- spring MVC (5)
- MySQL (12)
- junit (4)
- maven (10)
- jquery (1)
- mongoDB (16)
- git (0)
- mybatis (5)
- svn (3)
- activemq (3)
- quartz_job (1)
最新评论
-
白天看黑夜:
PDMReader实现pdm建模快速导出word,html文件 ...
利用powerDesigner逆向导出oracle表为PDM并把PDM转为CDM -
sanshao:
roompig 写道beancopier只实现了浅拷贝的功能, ...
使用Cglib的BeanCopier实现Bean的拷贝 -
贝塔ZQ:
Java实现导入导出excel文件,利用poi实现感觉代码比较 ...
利用java导入导出excel到oracle数据库 -
suxj16:
部署之后启动有问题org.springframework.be ...
spring mvc文件上传实现进度条(转) -
suxj16:
谢谢分享。部署之后启动有问题org.springframewo ...
spring mvc文件上传实现进度条(转)
oracle普通索引介绍(单字段索引) : http://ysj5125094.iteye.com/blog/1745354
首先,在大多数情况下,复合索引比单字段索引好.以税务系统的SB_ZSXX(申报类_征收信息表)为例,该表为税务系统最大的交易表.如果分别按纳税人识别号,税务机关代码,月份3个字段查询,每个字段在该表中的可选性或约束性都不强,如一个纳税人识别号有很多纳税记录,一个税务机关代码和同一月份记录就更多了,所以3个字段合起来,"某个纳税人识别号+某个税务机关代码+某月"的记录就少多了.因此复合索引比单字段索引的效率高多了.很多系统就是靠新建一些合适的复合索引,使效率大幅度提高.
但是,复合索引比单字段索引的内容原理复杂,复合索引有两个重要原则需要把握: 前缀性和可选性.如果糊里糊涂的滥用复合索引,效果适得其反.
以例子来说明,例子如下:
假设在员工表(emp)的(ename,job,mgr)3个字段上建了一个索引,例如索引名叫idx_1.3个字段分别为员工姓名,工作和所属经理号.然后,写如下一个查询语句,并不断进行查询条件和次序的排列组合,例如:
select * from emp where ename = 'a' and job = 'b' and mgr = 3 ; select * from emp where job = 'b' and ename = 'a' and mgr = 3 ; select * from emp where mgr = 3 and ename = 'a' and job = 'b' ; select * from emp where mgr = 3 and job = 'b' and ename = 'a' ; select * from emp where job = 'b' and mgr = 3 and ename = 'a' ; .....
回答问题:在各种条件组合情况下,刚才建的索引(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(转)
2015-01-09 14:47 2432文章出自:http://blog.csdn.net/ ... -
MySQL分组后排序的问题(转)
2014-05-21 11:31 1722文章出自:http://zhidao.baidu.co ... -
在oracle的decode函数中实现like相同操作
2014-03-28 14:37 10906在oracle的decode函数中不能使用like操作 ... -
45个非常有用的Oracle查询语句分享
2014-03-17 13:41 972文章出自:http://tech.it168.com ... -
能使 Oracle 索引失效的七大限制条件
2014-03-17 13:11 6229文章出自:http://tech.it168.com/ ... -
oracle存储过程异常处理及时间戳变量类型
2014-03-15 18:02 3114下面通过一个简单 ... -
对只转发结果集的无效操作: isLast
2014-03-13 14:19 2728在遍历结果集的时候,用rs.isLast()来判断是否到达 ... -
oracle连接DBLINK报错:ORA-12154: TNS:could not resolve service name的解决办法(转)
2014-01-13 15:56 3158文章出自:http://blog.csdn.net/x ... -
查看oracle enterprise manager端口的途径(转)
2014-01-13 12:04 1334文章出自:http://www.myexception ... -
利用java导入导出excel到oracle数据库
2013-12-05 14:46 8643用到的JAR包如下(可以直接到POI官网上下载也可以 ... -
WebSphere+Oracle乱码问题解决
2013-11-26 15:01 1581环境介绍: Web容器(中间件):W ... -
v$session 的权限(转)
2013-11-15 13:32 1835文章出自:http://blog.csdn.net/x ... -
Oracle中查看所有表和字段(转)
2013-08-29 11:48 1258文章出自以下两个网站: Oracle中查看所有表和字 ... -
oracle杀掉正在运行的存储过程
2013-08-28 16:05 3268本篇文章主要介绍如何kill掉一个正在运行的存储过程, ... -
oracle中v$access视图介绍
2013-08-28 15:49 8488如果想了解如果杀掉一个正在运行的存储过程,请查询这篇 ... -
oracle 临时表介绍(整合)
2013-08-27 11:14 2482在工作中用临时表从A库到B库导入LOB(大)字段,用临 ... -
oracle 的连接操作(left jion,right jion, full jion)
2013-06-14 12:52 25441.创建测试表 -- Create table ... -
如何查看oracle的版本信息(转)
2013-05-07 08:30 1221文章出自: http://blog.sina.com. ... -
oracle触发器实践(增,改,删)
2013-04-27 14:02 1395实现对某个表的增改删的监控操作,并记录到另一个表中. ... -
Oracle如何正确删除archivelog文件(转)
2013-04-10 13:29 2959文章出自 : http://cac ...
相关推荐
* 复合索引:对表创建的索引是基于多个字段对表中的记录排序的。 索引的创建 ------------ 创建索引可以使用 Enterprise Manager、Transact-SQL 语句和索引优化向导等方法。 * 用 Enterprise Manager 创建索引:...
- **复合索引(Composite Index)**: 包含多个列的索引,按列的顺序排列,对于包含这些列的查询非常有效。 **使用和维护索引的注意事项:** - 索引会占用额外的存储空间,并且在插入、删除和更新数据时需要维护,...
Oracle数据库在处理复合索引和空值时的行为是SQL优化中的一个重要知识点,特别是对于大型数据库系统来说,理解这些细节能够显著提升查询效率。本文将详细探讨Oracle如何处理含有空值的复合索引以及非空约束对索引...
2. 索引策略:根据查询需求选择合适的索引策略,如单字段索引、多字段索引或复合索引。 3. 分区索引:对于大型表,可以考虑使用分区索引来提高全文搜索效率。 六、全文索引的安全和权限 1. 权限管理:Oracle允许对...
- 如果需要确保多个字段的组合是唯一的,可以创建一个基于这些字段的复合唯一约束或索引。 6. **性能考虑** - 唯一约束在插入、更新和删除操作时会进行实时检查,可能会降低性能。而唯一索引则在查询时提供更快的...
#### 二、Oracle 索引介绍 索引是用于快速查找表中数据的一种数据结构。Oracle提供了多种类型的索引,每种类型都有其适用场景。 ##### 1. 常见索引类型 - **B树索引**:最常见的索引类型,适用于各种查询场景。 -...
但如果查询条件需要,可以在已有的单字段索引上添加新的复合索引。 8. **监控与分析**:利用Oracle的分析工具(如EXPLAIN PLAN)来评估索引设计是否合理,根据执行计划调整索引策略。 总之,Oracle索引设计是一个...
例如,使用`SUBSTR`, `DECODE`, `INSTR`等函数来处理索引字段。 **解决办法**: - 尝试重构SQL语句,避免在索引列上使用这些函数。 - 如果无法避免使用这些函数,可以考虑创建一个函数索引(Function-Based Index)来...
(3)两列比一列好:Oracle 允许用户建立复合索引,这种索引针对多个表列。 (4)where 子句和索引:Oracle 根据用户在 where 子句中的定义找出满足查询要求的索引项(如根据一条 SQL 语句中的 where 和 and 部分...
4. 考虑复合索引:对于多个列的查询,可以创建复合索引来提高查询性能。 总之,Oracle索引是优化数据库性能的重要工具。理解索引的工作原理、类型和管理方法,有助于我们更有效地设计和使用索引,从而提升数据库...
同时,如果复合索引中的字段经常单独出现在WHERE子句中,那么将复合索引分解为多个单字段索引可能更为合适。另外,如果已经存在单字段索引,同时也有包含这些字段的复合索引时,一般可以考虑删除复合索引,以减少...
Oracle索引建立原则 · 确定针对该表的操作... · 在经常存取的多个列上建立复合索引,但要注意复合索引的建立顺序要按照使用的频度来确定; · 尝试建立复合索引来进一步提高系统性能。修改复合索引将消耗更长
10. 如果复合索引中的字段经常单独被查询,应分解为多个单字段索引。 11. 复合索引的字段超过3个时,需要评估其必要性,可能需要减少字段数量。 12. 若已有单字段索引和相同字段的复合索引,通常可以删除复合索引。 ...
复合索引在单字段索引效率较低时才有价值,但频繁更新的表应谨慎使用,因为它们可能降低写操作性能。 2. **避免全表扫描**:使用函数索引(Function-based Index, FBI)可以显著提高特定查询的速度,且在更新未涉及...
1. **单列索引和复合索引**:单列索引是基于单一列创建的,而复合索引则由两个或更多列组成。复合索引可以优化涉及多列的查询,特别是当查询条件包括多列时。 2. **B树索引**:这是Oracle中最常见的索引类型,也是...
8. 使用复合索引 9. 使用单字段索引 10. 用索引进行有界限范围的查找 11. 用索引字段进行无界限的查找 12. 排序合并连接 13. 对索引字段使用 MAX 或 MIN 函数 14. ORDER BY 索引字段 15. 全表扫描 RBO 优化器会根据...
5. **组合索引**:对于复合索引,只有包含所有引导列的查询条件才会使用索引。如果只筛选组合索引中的部分列,那么索引可能不会被充分利用。应确保WHERE子句中的条件至少包含组合索引的引导列。 在分析索引使用情况...
复合索引适合于查询条件经常同时包含多列的情况,而单独索引更适合于单独字段的频繁查询。此外,需要注意的是,虽然索引能提高查询性能,但也会占用额外的存储空间,并可能影响数据插入、更新和删除的性能,因为每次...
8. 没有对复合索引的所有列进行分析,或者单独引用了复合索引的非首列。 9. 使用`NOT IN`或`NOT EXISTS`子句,这通常需要优化器进行复杂处理,可能导致不使用索引。 10. 当日期和时间类型的比较出现问题,如使用...