您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页Oracle的索引

Oracle的索引

来源:五一七教育网
2010年第13期 OIT论坛。科技信息 Oracle的索引 邓小培孙洪涛 (郑州科技学院河南郑州450064) 【摘] ̄]Oracle的索引,是最常用的数据库优化手段,索引就好象一本字典的目录。合适的好的索引,不但能极大的优化查询的性能,还能 优化与查询相关的操作的性能。 【关键词】选择率;索引类型 <>、I_) 2.1 使用不等于操作符(下面的查询即使在cust_rating列有一个索引,查询语句仍然执行 索引是常用的查询优化手段,但是,却是一个技术含量很高的技 次全表扫描。 术,它和索引选择性以及执行计划密切相关。好的索引,可以极大的提 select cust Id,oustname 高查询速度,坏的索引,优化器不但不让它起效,还影响写操作的速 from customers 度; where custrating<>’aa。: 简单的说,选择性高的索引是好索引。选择性是指符合条件的行 把上面的语句改成如下的查询语句,这样,在采用基于规则的优 数与总行数之比。如果比率较低,索引就是高选择性的。最好的索引是 化器而不是基于代价的优化器(更智能)时,将会使用索引。 唯一性索引。如果选择性较低,索引扫描比全表扫描还慢很多; select cust_Id,custname 不是说表上的索引越多越好,宁缺勿滥,这是建立索引时的一个 from customers 遵循标准。表中的索引越多,维护索引所需要的开销也就越大。每当数 ating<’aa'or custmfwhere custring> aa’: 0引言 一____据表中记录有增加、删除、更新变化的时候,数据库系统都需要对所有 __索引进行更新。故数据库表中的索引绝对不是多多益善,要根据具体 以避免全表扫描。 业务的需求,建立合适的索引。 2.2使用ISNULL或ISNOTNULL 本文中主要描述Oracle9.2版本中的索引状况。在不同的版本中, 使用ISNULL或ISNOTNULL同样会索引的使用。因为 情况会有很大不同。 NULL值并没有被定义。在SQL语句中使用NULL会有很多的麻烦。 因此建议开 发人员在建表时,把需要索引的列设成NOT NULL。如 1 索引类型 果被索引的列在某些行中存在NULL值,就不会使用这个索引(除非 1.1 B 树结构索引 索引是一个位图索引,关于位图索引在稍后在详细讨论)。 这些是我所说的“传统“索引。到目前为止,这是Oracle和大多 2-3使用函数 ・ 数其他数据库中最常用的索引。B 树的构造类似于二叉树,能根据 如果不使用基于函数的索引,那么在SQL语句的WHERE子句中 键提供一行或一个行集的快速访问,通常只需很少的读操作就能找到 对存在索引的列使用函数时,会使优化器忽略掉这些索引。 正确的行。不过,需要注意重要的一点,”B 树“中的”B“不代表二 下面的查询不会使用索引(只要它不是基于函数的索引) 叉(binary),而代表平衡(b alanced)。B 树索引并不是一颗二叉树, select empno,ename,deptno 这一点在介绍如何在磁盘上物理地存储B 树时就会了解到。B 树 from emp 索引有以下子类型:索引组织表(indexorganizedtable)、B 树聚簇索 here twrune(hiredate)=。O1一MAY一8l’: 引(B'tree cluster index)、降序索引(descending index)、反向键索引( 把上面的语句改成下面的语句,这样就可以通过索引进行查找。 reversekeyindex o 特别注意:通过把不等于操作符改成OR条件,就可以使用索引, selcte empno,ename,deptno 1.2位图索引 from emp 在一颗B 树中,通常索引条目和行之间存在一种一对一的关系: herwe hiredate<(to_date(。01一MAY-81 ̄+0.9999); 个索引条目就指向一行。而对于位图索引,一个索引条目则使用一 2.4比较不匹配的数据类型 个位图同时指向多行。位图索引适用于高度重复而且通常只读的数据 比较不匹配的数据类型也是比较难于发现的性能问题之一。注意 (高度重复是指相对于表中的总行数,数据只有很少的几个不同值)。 下面查询的例子。accounLnumber是一个VARCHAR2类型,在 考虑在一个有100万行的表中,每个列只有3个可取值:Y、N和 account number字段上有索引。下面的语句将执行全表扫描。 NULL。举例来说,如果你需要频繁地统计多少行有值Y,这就很适合 name,address,city,state,zip select bank建立位图索引。不过并不是说如果这个表中某一列有1 1.000个不同 from banks 的值就不能建立位图索引,这一列当然也可以建立位图索引。在一个 here awccounLnumber=990354; OLTP数据库中,由于存在并发性相关的问题,所以不能考虑使用位 Oracle可以自动把where子句变成to_number(ccaount_number) 图索引(后面我们就会讨论这一点)。注意,位图索引要求使用Oracle 990354,这样就了索引的使用,改成下面的查询就可以使用索 企业版或个人版。 引: 一_=1-3基于函数的索引 address,city,state,zip select bankname,_基于函数的索引也是8i以来的新产物,它有索引计算列的能力, 它易于使用并且提供计算好的值,在不修改应用程序的逻辑上提高了 查询性能。 from banks where accountnumber=’990354’: _2索引的条件 一特别注意:不匹配的数据类型之间比较会让Oracle自动索引 的使用,即便对这个查询执行Explain Pln也不能让您明白为什么做 a了一次“全表扫描”。 是不要对一些记录内容比较少的表建立索引。 数据量比较少的表,oracle自动将全表都放入缓冲区,此时,不必 3 监控索引使用情况 建立索引,全表扫描的速度会更快,即使建立了索引,oracle优化器也 建立了索引,是想让oracle使用这个索引,但是,优化器要评估是 更倾向于使用全表扫描,因为oracle的优化器评估认为全表扫描性能 使用索引更好还是全表扫描更好,不良索引不但不提高查询质量,而 更好。 且影响写操作速度。 索引是一些没有经验的开发人员经常犯的错误之一。在SQL 索引监控就是在一段时问里监控一个用户的全部(下转第25页J 中有很多陷阱会使一些索引无法使用。下面讨论一些常见的问题: 。本刊重稿o 2010年第13期 …,,省略根据语音命令进行控制的部分程序 break; ) 】 ) 4-3语法规则文件(CmdCtr1.xm1): <GRAMMAR LANGID=”8O4”> <DEFINE> <ID NAME=”CMD”VAL=”10”,> (,DEFINE> <RUI NAME=”COMMAND”ID=”CMD” r0PLEVEL=”ACTIVE”> <L> 图2程序运行界面 <P>退出<月P> <P>启动幻灯片 > 这种远程语音识别装置可以应用于很多工业控制以及日常生活领域 中,并且对计算机的控制不限于简单的对Office软件的控制,所以可 <P>退出幻灯片(,P> (省略其他指令) …………以实现更复杂的控制,具有很强的通用性和可扩展性。e 【参考文献】 [1]肖玮.使用SAPI实现语音识别和合成田.现代计算机,2005,(2):91—94. [2]李禹材,左友东.基于Speech SDK的语音控制应用程序的设计与实现咖.计 算机应用,2006,(6):114-ll6. 【3 JMicrosoftSpeechSDK5.1 Hdp[EB/OL].http:llwww.microsoft.corn. <凰ULE> <,GRAMMAR> 5程序运行及现场测试 [4]胡来林,唐龙英.Vc++中运用OLE和宏实现OF ̄CE软件考试自动评分册. 程序运行界面如图2所示,为了验证系统的功能,在学校的普通 计算机应用研究,2001,(9):111-l12,117. 周应芳,李庆华.VC开发一基于O伍ce组件应用程序[MI.计算机与数字工程, 多媒体教室对本系统进行了测试,选择了不同性别的十个测试对象, [5]8):49-52,132. 对预置的所有语音命令进行语音命令测试,结果在无线装置的距离范 2005,(MSDN[DB/OL].http:/ 围(十五米)内,准确识别并控制成功率在85%以上,基本达到普通课 [6]堂使用的要求。 ※基金项目:获郑州大学创新实验项目支持。项目号为 6结束语 2008CXSY037。 本系统基于SAPI语音开发平台,在VC开发环境下,利用FM的 无线收发方式,实现了无线远程对计算机进行语音控制的功能。由于 【责任编辑:曹明明】 (上接第66页)索引,看哪些索引数据库根本就没有使用到,对无效的 索引,需要做修改或删除。 索引监控的脚本: 3.1创建打开索引监控的存储过程 createorreplaceprocedurePIDX..JKis _v_idxtype varchar2(50):=null; __cursor eidx is select indexname,index type from userindexes; __begin open c-idx; lop fetch cidx into vidxname,v._idx type; _一监控所有的索引 ____vv__name varehar2(5o):=nuU; idxtype varehar2(5o):=null; idx__fv idx tiype<>’LOB’then execute immediate’alter indexusage; ’Ilvidxname ___nomonitoring cursor c_idx is select indexname,index_type from user_indexes; _begin openc_idx; lop fletch cidx into vidx name.vidxtype; __dhmsoutput.put_line r.alter index’IIvidxname nomonitoring ____usage’); endif; .__exit when eidx%NOTFOUND; _ifv idx type<>’LOB’then execute immediate’alter index’IIvidxname monitoring usage。: _endlop; _close cid ̄ _dbmsoutput.put_line ftalter index’IIvidxname儿1 monitoring ___end P IDXJKCLOSE; _usage’); end迹 exit when cidx%N0TF0UND: ._l 3.4查看索引使用情况 se1ect fromv¥object_usage endloop; close c_id)【; end PIDXJK; __对于显示没有使用的索引,要分析是涉及该索引的操作还没有运 行,还是索引根本就是无效的,对于无效的索引,应进行处理或者删 , 除。e 【参考文献】 [1]oracle官方文档.Orach9iDatabaseConceptsRdease2(9.2). 3.2运行系统一段时间 3-3关闭索引监控 create or replace procedure P_IDX_.JKCLOSE is —关闭索引监控 _【责任编辑:曹明明】 vidx_name varchar2(50):=null; 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务