- 浏览: 1716201 次
- 性别:
- 来自: 沈阳
文章分类
- 全部博客 (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 2354文章出自:http://blog.csdn.net/ ... -
MySQL分组后排序的问题(转)
2014-05-21 11:31 1687文章出自:http://zhidao.baidu.co ... -
在oracle的decode函数中实现like相同操作
2014-03-28 14:37 10816在oracle的decode函数中不能使用like操作 ... -
45个非常有用的Oracle查询语句分享
2014-03-17 13:41 926文章出自:http://tech.it168.com ... -
能使 Oracle 索引失效的七大限制条件
2014-03-17 13:11 6191文章出自:http://tech.it168.com/ ... -
oracle存储过程异常处理及时间戳变量类型
2014-03-15 18:02 3069下面通过一个简单 ... -
对只转发结果集的无效操作: isLast
2014-03-13 14:19 2675在遍历结果集的时候,用rs.isLast()来判断是否到达 ... -
oracle连接DBLINK报错:ORA-12154: TNS:could not resolve service name的解决办法(转)
2014-01-13 15:56 3089文章出自:http://blog.csdn.net/x ... -
查看oracle enterprise manager端口的途径(转)
2014-01-13 12:04 1294文章出自:http://www.myexception ... -
利用java导入导出excel到oracle数据库
2013-12-05 14:46 8563用到的JAR包如下(可以直接到POI官网上下载也可以 ... -
WebSphere+Oracle乱码问题解决
2013-11-26 15:01 1546环境介绍: Web容器(中间件):W ... -
v$session 的权限(转)
2013-11-15 13:32 1793文章出自:http://blog.csdn.net/x ... -
Oracle中查看所有表和字段(转)
2013-08-29 11:48 1224文章出自以下两个网站: Oracle中查看所有表和字 ... -
oracle杀掉正在运行的存储过程
2013-08-28 16:05 3188本篇文章主要介绍如何kill掉一个正在运行的存储过程, ... -
oracle中v$access视图介绍
2013-08-28 15:49 8396如果想了解如果杀掉一个正在运行的存储过程,请查询这篇 ... -
oracle 临时表介绍(整合)
2013-08-27 11:14 2437在工作中用临时表从A库到B库导入LOB(大)字段,用临 ... -
oracle 的连接操作(left jion,right jion, full jion)
2013-06-14 12:52 25031.创建测试表 -- Create table ... -
如何查看oracle的版本信息(转)
2013-05-07 08:30 1168文章出自: http://blog.sina.com. ... -
oracle触发器实践(增,改,删)
2013-04-27 14:02 1347实现对某个表的增改删的监控操作,并记录到另一个表中. ... -
Oracle如何正确删除archivelog文件(转)
2013-04-10 13:29 2920文章出自 : http://cac ...
相关推荐
Oracle索引建立原则 · 确定针对该表的操作... · 在经常存取的多个列上建立复合索引,但要注意复合索引的建立顺序要按照使用的频度来确定; · 尝试建立复合索引来进一步提高系统性能。修改复合索引将消耗更长
C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引; D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段; E、如果既有单字段索引,又有这几个字段上...
在对建有复合索引的字段进行检索时,应注意按照复合索引字段建立的顺序进行。例如,如果对一个5万多条记录的流水表以日期和流水号为序建立复合索引,由于在该表中日期的重复值接近整个表的记录数,用流水号进行查询...
一、 常见问题记录 3 ... 2. 数据库重启 5 ...6. 查看索引类别以及查看索引字段被引用的字段方法 141 二十、 SQL优化: 141 1. sql查询语句优化 141 2. 提高SQL查询效率 143 3. 百万级数据库优化方案 149
ORACLE用户是学习ORACLE数据库中的基础知识,下面就介绍下类系统常用的默认ORACLE用户: 1. sys用户:超级用户,完全是个SYSDBA(管理数据库的人)。拥有dba,sysdba,sysoper等角色或权限。是oracle权限最高的用户,...
§13.1.3 选择复合索引的主列 161 §13.1.4 要用可选择性索引 162 §13.1.5 测量索引的可选择性 162 §13.1.6 避免全表扫描 163 §13.1.7 编写避免使用索引的语句 163 §13.1.8 编写使用索引的语句 164 §13.1.9 ...
如果复合索引中包含的字段经常单独出现在 where 子句中,则分解为多个单字段索引。 如果复合索引所包含的字段超过 3 个,那么仔细考虑其必要性,考虑减少复合的字段。 如果既有单字段索引,又有这几个字段...
多个字段时,在最后加上 Foreign Key (字段名) REFERENCE 表名(字段) 连带删除选项 (on delete cascade 当指定时,如果父表中的记录被删除,则依赖于父表的记录也被删除 REFERENCE 表名() on delete cascade; 7...
本文是由笔者2012年学习oracle数据库时编写的学习札记,其中的题目 多数为老师留下的思考题目。 我相信本文会对初学者使用oracle有一个初步的使用印象。右图为我所参 考的书籍。 目录 第一讲 Oacle关系数据库 ...
MySQL中,有两种方式生成语序结果集,一种是使用file sort(慢查询),一种是按索引顺序扫描(要在经常排序的字段上建立索引)注意:不是索引越多越好! 为索引列选择合适的数据类型 越小的数据类型通常更好:越小的...
5.2.5 创建复合索引 5.3 删除索引 5.3.1 删除索引的语句结构 5.3.2 使用SQL语句删除索引 5.4 视图的基础知识 5.4.1 视图概述 5.4.2 视图的优点与缺点 5.5 视图的基本操作 5.5.1 创建视图的基本语句结构 5.5.2 使用...
优化复合索引。 注意索引的相关参数。 注意索引与谓词的关系。 根据查询所使用的列表建立索引。 根据条件语句中的谓词的选择度创建索引。 避免在建有索引的列上使用函数。 在那些需要被排序的列上创建索引。 合理...
第二篇是面向对象基础篇,主要介绍类、对象、字段、方法、流程控制、数组、继承、属性、运算符重载、接口等C#基本内容。第三篇是应用技术篇,主要介绍的是异常处理、文件和流、委托、事件、Lambda表达式、命名空间、...
4) SQLJ: 很新的一种用Java访问Oracle数据库的方法,会的人不多; 5) JDBC 6) PL/SQL: 存储在数据库内运行, 其他方法为在数据库外对数据库访问,只适合ORACLE; 2. PL/SQL 1) PL/SQL(Procedual language/SQL)...
6、什么样的字段适合建索引 41 7、索引类型有哪些? 42 8、什么是事务?什么是锁? 42 9、什么叫视图?游标是什么? 43 10、视图的优缺点 43 11、列举几种表连接方式,有什么区别? 43 12、主键和外键的区别? 44 13...
Oracle数据库字典介绍 0RACLE的字段类型 事务 CMT DEMO(容器管理事务演示) 事务隔离性的一些基础知识 在组件之间实现事务和异步提交事务(NET2.0) 其它 在.NET访问MySql数据库时的几点经验! 自动代码生成器 关于能...
14.5 索引与唯一值的介绍 229 14.6 数据的操作 230 14.6.1 表的修改 230 14.6.2 表的删除 231 14.6.3 数据的查询 231 14.6.4 数据的插入 236 14.6.5 数据的更新 238 14.6.6 数据的删除 239 14.7 小结 239 第15章 ...
4.5.2 公有字段传递 177 4.5.3 委托与事件传递 179 4.6 实现个性化窗体界面 181 4.7 无标题窗体拖动的两种方法 183 4.8 让程序只启动一次——单实例运行 184 4.9 实现系统托盘和热键呼出 185 4.10 进程与多线程的...
4.5.2 公有字段传递 177 4.5.3 委托与事件传递 179 4.6 实现个性化窗体界面 181 4.7 无标题窗体拖动的两种方法 183 4.8 让程序只启动一次——单实例运行 184 4.9 实现系统托盘和热键呼出 185 4.10 进程与多线程的...