ORACLE索引优化原则

合集下载

oracle优化方法总结

oracle优化方法总结

千里之行,始于足下。

oracle优化方法总结Oracle优化是提高数据库性能和响应能力的重要步骤。

本文总结了一些常见的Oracle优化方法。

1. 使用索引:索引是提高查询性能的主要方法。

通过在表中创建适当的索引,可以加快查询速度,并减少数据访问的开销。

但是要注意不要过度使用索引,因为过多的索引会增加写操作的开销。

2. 优化查询语句:查询语句的效率直接影响数据库的性能。

可以通过合理地编写查询语句来提高性能。

例如,使用JOIN来替代子查询,尽量避免使用通配符查询,使用LIMIT来限制结果集的大小等。

3. 优化表结构:表的设计和结构对数据库的性能也有很大的影响。

合理的表设计可以减少数据冗余和不必要的数据存储,提高查询速度。

例如,适当地使用主键、外键和约束,避免过多的数据类型和字段等。

4. 优化数据库参数设置:Oracle有很多参数可以用来调整数据库的性能。

根据具体的应用场景和需求,可以根据情况调整参数的值。

例如,调整SGA和PGA的大小,设置合适的缓冲区大小,调整日志写入方式等。

5. 使用分区表:当表的数据量很大时,可以考虑将表分成多个分区。

分区表可以加速查询和维护操作,提高数据库的性能。

可以按照时间、地域、业务等来进行分区。

6. 优化存储管理:Oracle提供了多种存储管理选项,如表空间和数据文件管理。

合理地分配存储空间和管理数据文件可以提高数据库的性能。

例如,定期清理无用的数据文件,使用自动扩展表空间等。

第1页/共2页锲而不舍,金石可镂。

7. 数据压缩:对于大量重复数据或者冷数据,可以考虑使用Oracle的数据压缩功能。

数据压缩可以减少磁盘空间的使用,提高IO性能。

8. 使用并行处理:对于大型计算或者批处理任务,可以考虑使用Oracle的并行处理功能。

并行处理可以将任务分成多个子任务,并行执行,提高处理能力和效率。

9. 数据库分区:对于大型数据库,可以考虑将数据库分成多个独立的分区。

数据库分区可以提高数据的并行处理能力,减少锁竞争和冲突,提高数据库的性能。

Oracle SQL语句优化技术分析

Oracle SQL语句优化技术分析
4 结 论
O a e S L 句的性 能问题 常常是 由于 rl Q 语 c 在索引设计和查询设计方面存在各种缺陷引起 的。 Q 优化的实质就是在结果正确的前提下 , SL 充份利用索引 , 减少表扫描的 I / O次数 , 尽量避 免表搜索的发生 。 其实 S L Q 的性能优 化是一个 复杂的过程 ,以上这些只是在应用层次 的一种 体现 , 深入研究还会涉及数据库层 的资源配置 、 网络层的流量控制 以及操作系统层 的总体设计 如 等等方面 , 已经超 出本文所要讨论 的范 围, 这些 S EC EL T FROM US ER LOG WHER 因此不在本文赘述 了。 E 总之 Oal S L语句 的 r e Q c USE N R AME ei ( L C U E _ A 不断总结 , 才 xs t S E T S R N ME 优化需要我们在生产 中不断学习 , E FROM T F W HE TY C D =05 ' S AF E R CI 能更为得心应手 的应用到工作中去。 O E ' 1 4 3 O N操作符 . N TI 2 此操作是 强列不推荐使用 的 , 因为它不能
的 ,因为索引是不索引空值的。使用 I N L SU 或 I O U ,r l会停止使用 索引而执 SN TN L Oa e c 行 全表扫描。 以考虑在设计表时 , 引列设 可 对索 置为 N T N L 。这样就可以用其他操作来取 O U L 代 判断 N L 的操作。 UL
_
b .同一功能 同一性能 不同写法 S QL的影 响。 如一个 S L在 A程序员写的为 slc S Q eetU— e a ,s d f m s fB程序员写 的为 s—  ̄nme e r t u o a e le s r n meu e i f m zj s ( e t u e a . s r d r h .a 带表所有 o st f 者的前缀 )c程序员写的为 Sl tu rn n, e c s_s e e e z u ser i f m Z J . A F ( 写表名 )D程序 d r HS T F 大 o S 员 写 的 为 Slc srnme sri f m e et e_a , e_d r u u o z SS A F 中间多 了空格 )以上 四个 S L在 Ⅲ . F( T Q OAL R C E分析整理之后产生的结果及执行的时

Oracle 索引的使用规则与性能调优

Oracle 索引的使用规则与性能调优

Oracle 索引的使用规则与性能调优索引分类逻辑上:Unique 唯一索引物理上:B-tree:Normal 正常型B树Bitmap 位图索引索引结构:B-tree:适合与大量的增、删、改(OLTP);不能用包含OR操作符的查询;适合高基数的列(唯一值多)典型的树状结构;每个结点都是数据块;大多都是物理上一层、两层或三层不定,逻辑上三层;叶子块数据是排序的,从左向右递增;在分支块和根块中放的是索引的范围;Bitmap:适合与决策支持系统;做UPDATE代价非常高;非常适合OR操作符的查询;基数比较少的时候才能建位图索引;树型结构:索引头开始ROWID,结束ROWID(先列出索引的最大范围)BITMAP每一个BIT对应着一个ROWID,它的值是1还是0,如果是1,表示着BIT对应的ROWID 有值;B*tree索引的话通常在访问小数据量的情况下比较适用,比如你访问不超过表中数据的5%,当然这只是个相对的比率,适用于一般的情况。

bitmap的话在数据仓库中使用较多,用于低基数列,比如性别之类重复值很多的字段,基数越小越好。

索引就好象一本字典的目录。

凭借字典的目录,我们可以非常迅速的找到我们所需要的条目。

数据库也是如此。

凭借Oracle数据库的索引,相关语句可以迅速的定位记录的位置,而不必去定位整个表。

虽然说,在表中是否创建索引,不会影响到Oracle数据库的使用,也不会影响数据库语句的使用。

这就好像即使字典没有目录的话,用户仍然可以使用它一样。

可是,若字典没有目录,那么可想而知,用户要查某个条目的话,其不得不翻遍整本字典。

数据库也是如此。

若没有建立相关索引的话,则数据库在查询记录的时候,不得不去查询整个表。

当表中的记录比较多的时候,其查询效率就会很低。

所以,合适的索引,是提高数据库运行效率的一个很好的工具。

不过,并不是说表上的索引越多越好。

过之而不及。

故在数据库设计过程中,还是需要为表选择一些合适的索引。

Oracle数据库优化原则和方法

Oracle数据库优化原则和方法
一 一
当表 的记录数较大时 , 必然会影响查询速度。 这时 , 通过索引 查 询数据 比全表扫描效率要 高得 多。在写S L Q 语句时 , 应遵循 以 下原则 :避免在索引列上 使用N TI 、 U LI O U L O I N L 、 N TN L 、 NS S LK 等操作符或者 函数计算( IE 如转换字段类型 )否D O al , ] rc 数据 e 库会停止使用索引转而执行全表扫描。实际应用 中 , 有时必须要 在列 中应用函数等条件 ,则可以通过强制索引提示来利用索引。 当然 , 不一定用索引就一定是最优 的, 比如一个表只有两行数据 , 次I 就可 以完成全表 的检索 , / O 而此时用索引则需要两次I 这 / O, 时对这个 表做全表扫描是最好的。
hr d t ,.o ie aeb c mm r m mp ,o u F o e eb n s b w e eee a = .n me h r .n me b e a

调 整操 作 系统
ห้องสมุดไป่ตู้
Oal数据库服务器很 大程度上依 赖于运行 服务器 的操作 rce 系统 , 应尽 可能使O al  ̄ rc n 务器使用资源最大化 , e 特别是在Ci t ln e/ Sre,. evr_  ̄间的I 操作 。在数据库中建 表时, / O 对于一些简单且有特 殊要求 的数据 , 上适 当的完整性约束条件 ; 加 对一些较复杂 的处 理规则 , 可以利用数据 库触 发器来实现 , 数据库触发器 由数据本 身实现。另外 , 通过在O al 据库 中创建存储过程和函数 , rce 数 把复 杂 的s L Q 语句存储在服务器端 , 使应用程序 只需要简单地调用存 储过程和函数 , 网络上只需传输调用 的存储过程或 函数 的名字 在 和输出结果 。 这样都 可以有效地减少在客户端和服务器端之间传 递S L Q 语句的可能性 , 减轻网络I 负担。 / O 通 过 长 期 维 护 经 验 总 结 :0 8 %的性 能 问题 都 是 由不 良的S L Q 语句引起的, 所以调剂 和建立最佳的s L Q 语句对于业务系统的可 扩展性 和响应时间来说都显得尤为重要。影响s L Q 语句执行速度 的主要因素有 : 驱动表 的选择是否恰 当、 查询时是否用到恰当的 索引 、 间的连接顺序及条件顺序是否恰 当等 。对于一段准备 表之 执行 的s L Q 语句 , 首先分析其执行计划 。现在有很多 可视化工具 , 比如P Q 或者T A 等都提供 了非常方便的手段来获取 s L L OD Q 语 句的执行计划 。 通过分析执行计划 , 结合涉及到的表 的数据量 , 我 们 可以估算 或者测试该语句 的执行效率 ,分析表WH R 条件中 EE 涉及的字段 。根据s L Q 语句 中使用的查询条件 , 总能够找到一个 性 能最优 的执行方式 。调整S L Q 语句 的写法 , 可以遵循 以下 优化 原则和方法 : 在基于规则的优化方式 ( ue B sd pmi t n 简 R l ae O i z i , — ao 称为R O)的情况下 ,R M子句 中写在最后 的表将作 为驱 动表 B FO 被最后处理 , 在关 联查 询多个表的情况下 , 应选择最有效率 的表

如何进行高效的数据库索引优化

如何进行高效的数据库索引优化

如何进行高效的数据库索引优化数据库索引是提高查询性能的重要手段之一。

通过正确使用索引,可以减少数据库的IO操作,提高查询效率。

下面将介绍一些高效的数据库索引优化的方法。

1.基本的索引优化原则-唯一性:根据数据表的唯一性约束,创建唯一索引,以保证数据的一致性和完整性。

-选择适当的列:在创建索引时,选择有重复值、经常查询或者范围查询的列,可以提高索引的效率。

-索引覆盖:尽量使用索引满足查询需求,避免使用全表扫描,提高查询效率。

2.表结构优化-商定数据类型:选择适当的数据类型,可以减小存储空间,提高索引效率。

-表分解:当表数据过大时,可以进行表分解,将相对不常用的列分解到独立的表中,减小主表的大小,提高索引效率。

3.索引类型选择- B-Tree索引:适用于查询条件是等值查询或范围查询的情况,对于数据有序的列,如日期、数字等,B-Tree索引效果较好。

-哈希索引:适用于等值查询较多的情况,哈希索引可以直接定位到存储区域,比B-Tree索引更快。

但是,哈希索引不支持范围查询。

-全文索引:适用于全文搜索的场景,如文章的关键字搜索。

-空间索引:适用于地理信息查询、位置服务等场景,可以优化空间查询的性能。

4.索引的创建和维护-避免过多的索引:太多的索引会增加索引维护的开销,也会降低更新操作(如插入、删除、更新)的性能。

在开发过程中要谨慎选择创建索引的字段。

-定时维护索引:经常进行索引的重建和优化,保证索引的最新状态,提高查询性能。

-删除不必要的索引:定期检查和分析索引的使用情况,删除不再使用或者无效的索引。

5.统计信息的收集和更新-更新统计信息:统计信息对于查询优化至关重要。

定期收集和更新统计信息,以便数据库优化器生成更好的执行计划。

-执行计划的分析:分析查询的执行计划,根据执行计划优化查询语句、索引或者表结构。

6.查询优化技巧-减少全表扫描:避免在查询中使用不带索引的列,使用索引尽量覆盖查询的需求。

-提高查询的可重用性:对于经常使用的查询,将其封装成存储过程或函数,可以避免重复的编译和解析过程,提高查询效率。

oracle索引优化原则

oracle索引优化原则

oracle索引优化原则Oracle索引是数据库优化中非常重要的一部分,它们能够在查询数据时提高查询效率和性能。

然而,在使用Oracle索引时,需要遵守一些原则,以便最大程度地提高查询效率和性能。

以下是一些Oracle索引优化的原则。

1.只在需要时使用索引Oracle索引能够帮助我们提高查询效率和性能,但它们也会降低更新和插入数据的速度。

因此,我们应当仅在需要时使用索引。

如果使用过多的索引,会导致查询语句变得复杂并且更新和插入速度变慢,从而影响整个数据库系统的性能。

2.使用唯一性索引唯一性索引可以帮助我们避免重复数据的插入和更新。

当数据库表中的某个列需要具有唯一性时,我们可以使用唯一性索引来实现。

这将确保同一列中的值不重复,从而提高整个数据库系统的性能。

3.使用复合索引如果查询语句需要同时查询多个列,我们可以使用复合索引来提高查询效率和性能。

使用复合索引时,需要注意索引的顺序,应该从前往后按照查询条件的顺序构建索引。

这样可以避免Oracle优化器无法使用索引而导致的全表扫描。

4.选择正确的索引类型Oracle提供不同的索引类型,包括B树索引、位图索引、函数索引等。

在选择索引类型时,我们应当根据查询语句的类型和数据的特点来选择最适合的索引类型。

例如,如果查询语句需要对大量的布尔类型或枚举类型数据进行查询,那么位图索引可能比B树索引更适合。

5.避免过度索引化过多的索引将会降低数据库系统的性能,每个索引都需要消耗一定的内存和磁盘空间,使得查询和更新操作变得更慢。

因此,我们应避免对相同的列建立多个重复的索引,并仅为确实需要的列创建合适的索引。

6.定期维护索引当数据表中的数据发生变化时,索引也需要随之更新。

因此,我们需要定期进行索引维护和优化,以确保索引数据与实际数据的一致性。

这样可以避免索引中出现“死数据”,也可以提高查询效率和性能。

在某些情况下,Oracle优化器会选择错误的索引,从而影响查询效率和性能。

数据库索引的维护与优化技巧

数据库索引的维护与优化技巧

数据库索引的维护与优化技巧数据库索引是提高数据库查询性能和数据检索效率的重要手段。

然而,在大量数据的情况下,使用不当的索引或索引的维护不完善会导致性能下降甚至崩溃。

本文将介绍一些数据库索引的维护和优化技巧,以帮助开发人员有效提升数据库的性能。

1.选择合适的索引在创建索引时,需要选择适合的字段作为索引列。

通常情况下,那些经常用于查询条件的字段应该作为索引列。

例如,在用户表中,根据用户名进行查询的频率很高,那么可以考虑为用户名列创建索引。

然而,过多的索引也会降低写操作的性能,因此需要权衡和选择。

2.避免冗余索引冗余索引是指多个索引覆盖相同的查询。

在实际应用中,由于人为疏忽或者维护失误,可能会创建相似的索引。

这不仅浪费了存储空间,还降低了修改数据时的性能。

因此,在设计数据库时,需要避免创建冗余索引,可以通过审查现有索引来识别和删除冗余索引。

3.使用组合索引组合索引是指由多个列组成的索引。

当多个列常常同时出现在查询条件中时,使用组合索引可以提高查询效率。

例如,在订单表中,同时根据订单日期和订单状态进行查询,可以为这两个字段创建组合索引。

组合索引更适用于查询频繁的列组合,可以减少索引的个数和占用的存储空间。

4.避免过度索引虽然索引可以提高查询性能,但是过度使用索引会降低写操作的性能。

因此,需要谨慎选择索引,并考虑索引对写操作的影响。

不需要频繁更新或插入的列可以不创建索引,以减少索引的维护和空间开销。

5.及时更新和重新组织索引随着数据的增长和修改,索引的结构和数据会变得不连续。

这可能导致查询效率下降。

因此,定期检查和更新索引是保持数据库性能的重要步骤之一。

可以通过数据库提供的优化工具或脚本来重新组织索引,以减少索引碎片和提高查询效率。

6.注意索引与数据的一致性当数据库中的数据发生改变时,索引也需要相应的更新。

如果不及时更新索引,可能会导致查询结果不一致或索引失效。

因此,在进行数据的插入、更新和删除操作时,确保及时更新相关的索引,保持数据的一致性和正确性。

oracle索引使用的原则

oracle索引使用的原则

oracle索引使用的原则Oracle索引是Oracle数据库中的一项重要功能,它通过加速查询操作,提高性能和效率,为应用程序提供更快更精确的数据检索功能。

然而,索引的使用也需要遵循一定的原则和规范。

本文将结合实际情况,从多个角度分析Oracle索引的使用原则,并给出具体的操作步骤和注意事项,以期能对读者有所启示和帮助。

一、了解索引的基本原理在使用Oracle索引之前,首先要了解索引的基本原理。

在Oracle数据库中,索引是一种特殊的数据结构,它通过保存相应列的特定的排序信息,从而加快数据的检索速度。

一般来说,索引可以分为唯一索引和非唯一索引两种类型。

唯一索引要求列中的值必须唯一,非唯一索引则不要求。

此外,还可以创建聚集索引和非聚集索引。

聚集索引是根据表数据本身的排列顺序来创建的索引,而非聚集索引则不是。

二、确定索引的创建方式和范围在创建Oracle索引之前,需要先确定索引的创建方式和范围。

索引的创建方式主要包括手动和自动两种方式。

手动创建索引需要对相应的列进行DDL操作,自动创建索引则是由Oracle数据库自动实现的。

此外,还要根据实际需要确定索引的范围。

Oracle索引分为单列索引、多列联合索引和函数索引等多种类型,需要根据具体情况进行选择。

三、注意索引的设计和使用方式在设计和使用Oracle索引时,需要注意以下几点:1、避免创建过多的索引。

过多的索引会占用大量的存储空间,降低数据库的性能。

2、尽可能使用非聚集索引。

由于聚集索引需要按照表数据本身的排列顺序来创建,因此容易产生磁盘碎片,反而会降低查询效率。

3、遵循最左原则。

多列联合索引的顺序很重要,一般来说,对查询条件最常使用的列放在最左侧。

4、避免对大字段进行索引。

对大字段进行索引会增加磁盘I/O 的负担,从而降低性能。

5、避免在频繁更新的列上创建索引。

频繁的数据更新会导致索引失效,降低查询效率。

四、定期维护和优化索引除了正确使用Oracle索引之外,还需要进行定期维护和优化工作,以保证索引的高效性和稳定性。

34种Oracle性能优化的方法

34种Oracle性能优化的方法

34种Oracle性能优化的方法1、选择最有效率的表名顺序(只在基于规则的优化器中有效):ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。

如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.2、WHERE子句中的连接顺序:ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.3、SELECT子句中避免使用‘ * ‘:ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间4、减少访问数据库的次数:ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等;5、在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE 参数, 可以增加每次数据库访问的检索数据量 ,建议值为2006、使用DECODE函数来减少处理时间:使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.7、整合简单,无关联的数据库访问:如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)8、删除重复记录:最高效的删除重复记录方法 ( 因为使用了ROWID)例子:DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)FROM EMP X WHERE X.EMP_NO = E.EMP_NO);9、用TRUNCATE替代DELETE:当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)10、尽量多使用COMMIT:只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:COMMIT所释放的资源:a. 回滚段上用于恢复数据的信息.b. 被程序语句获得的锁c. redo log buffer 中的空间d. ORACLE为管理上述3种资源中的内部花费11、用Where子句替换HAVING子句:避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销. (非oracle中)on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后,因为on是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的,where也应该比having快点的,因为它过滤数据后才进行sum,在两个表联接时才用on的,所以在一个表的时候,就剩下where跟having比较了。

常见Oracle数据库优化策略与方法

常见Oracle数据库优化策略与方法

常见Oracle数据库优化策略与方法
Oracle数据库优化是提高数据库性能的关键步骤,可以采取多种策略。

以下是一些常见的Oracle数据库优化策略:
1.硬件优化:这是最基本的优化方式。

通过升级硬件,比如增加RAM、使用
更快的磁盘、使用更强大的CPU等,可以极大地提升Oracle数据库的性能。

2.网络优化:通过优化网络连接,减少网络延迟,可以提高远程查询的效率。

3.查询优化:对SQL查询进行优化,使其更快地执行。

这包括使用更有效的
查询计划,减少全表扫描,以及使用索引等。

4.表分区:对大表进行分区可以提高查询效率。

分区可以将一个大表分成多
个小表,每个小表可以单独存储和查询。

5.数据库参数优化:调整Oracle数据库的参数设置,使其适应工作负载,可
以提高性能。

例如,调整内存分配,可以提升缓存性能。

6.数据库设计优化:例如,规范化可以减少数据冗余,而反规范化则可以提
升查询性能。

7.索引优化:创建和维护索引是提高查询性能的重要手段。

但过多的索引可
能会降低写操作的性能,因此需要权衡。

8.并行处理:对于大型查询和批量操作,可以使用并行处理来提高性能。

9.日志文件优化:适当调整日志文件的配置,可以提高恢复速度和性能。

10.监控和调优:使用Oracle提供的工具和技术监控数据库性能,定期进行性
能检查和调优。

请注意,这些策略并非一成不变,需要根据实际情况进行调整。

在进行优化时,务必先备份数据和配置,以防万一。

oracle 索引原则

oracle 索引原则

oracle 索引原则
Oracle索引的原则包括以下几点:
1. 唯一性原则:索引的值必须是唯一的,确保在索引字段上不存在重复值。

这可以通过在创建索引时添加UNIQUE约束来实现。

2. 精确性原则:索引应该被正确地定义和使用,以确保在查询时只返回需要的结果,并且能够准确地匹配查询条件。

使用合适的数据类型和大小限制可以提高索引的精确性。

3. 冗余性原则:索引应该避免对重复或冗余数据进行索引。

对于经常被查询的字段,可以考虑创建索引,而对于很少被查询的字段,则可以避免创建索引,以提高性能。

4. 支持性原则:索引应该能够支持常见的查询模式和条件,以提高查询性能。

合理选择索引字段和顺序,可以使索引更好地支持常用的查询操作。

5. 可管理性原则:索引应该易于管理,包括创建、修改和删除索引。

不需要的索引应该及时删除,以减少数据库的维护工作和存储空间占用。

6. 统计信息原则:索引应该基于准确和实时的统计信息进行优化。

Oracle提供了收集统计信息的机制,可以通过收集和更新统计信息来帮助数据库优化器选择最佳的查询计划。

综上所述,索引的原则是确保唯一性、精确性、避免冗余、支持常用查询模式、易于管理和基于准确统计信息进行优化。

这些原则有助于提高数据库的性能和可用性。

oracle sql优化常用的15种方法

oracle sql优化常用的15种方法

oracle sql优化常用的15种方法1. 使用合适的索引索引是提高查询性能的重要手段。

在设计表结构时,根据查询需求和数据特点合理地添加索引。

可以通过创建单列索引、复合索引或者位图索引等方式来优化SQL查询。

2. 确保SQL语句逻辑正确SQL语句的逻辑错误可能会导致低效查询。

因此,在编写SQL语句前,需要仔细分析查询条件,确保逻辑正确性。

3. 使用连接替代子查询在一些场景下,使用连接(JOIN)操作可以替代子查询,从而减少查询的复杂度。

连接操作能够将多个数据集合合并为一个结果集,避免多次查询和表的扫描操作。

4. 避免使用通配符查询通配符查询(如LIKE '%value%')在一些情况下可能导致全表扫描,性能低下。

尽量使用前缀匹配(LIKE 'value%')或者使用全文索引进行模糊查询。

5. 注意选择合适的数据类型选择合适的数据类型有助于提高SQL查询的效率。

对于整型数据,尽量使用小范围的数据类型,如TINYINT、SMALLINT等。

对于字符串数据,使用CHAR字段而不是VARCHAR,可以避免存储长度不一致带来的性能问题。

6. 优化查询计划查询计划是数据库在执行SQL查询时生成的执行计划。

通过使用EXPLAIN PLAN命令或者查询计划工具,可以分析查询计划,找出性能瓶颈所在,并对其进行优化。

7. 减少磁盘IO磁盘IO是影响查询性能的重要因素之一。

可以通过增加内存缓存区(如SGA)、使用高速磁盘(如SSD)、使用合适的文件系统(如ASM)等方式来减少磁盘IO。

8. 分区表对于大数据量的表,可以考虑使用分区表进行查询优化。

分区表可以将数据按照某个规则分散到不同的存储区域,从而减少查询范围和加速查询。

9. 批量操作尽量使用批量操作而不是逐条操作,可以减少数据库的事务处理开销,提高SQL执行效率。

可以使用INSERT INTO SELECT、UPDATE、DELETE等批量操作语句来实现。

Oracle中优化SQL的原则

Oracle中优化SQL的原则

Oracle中优化SQL的原则1.已经检验的语句和已在共享池中的语句之间要完全一样2.变量名称尽量一致3.合理使用外联接4.少用多层嵌套5.多用并发语句的优化步骤一般有:1.调整sga区,使得sga区的是用最优.2.sql语句本身的优化,工具有explain,sql trace等3.数据库结构调整4.项目结构调整写语句的经验:1.对于大表的查询使用索引2、少用in,exist等3、使用集合运算1.对于大表查询中的列应尽量避免进行诸如To_char,to_date,to_number等转换2.有索引的尽量用索引,有用到索引的条件写在前面如有可能和有必要就建立一些索引.3.尽量避免进行全表扫描,限制条件尽可能多,以便更快搜索到要查询的数据如何让你的SQL运行得更快不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句.在对它们进行适当的优化后,其运行速度有了明显地提高!下面我将从这三个方面分别进行总结:为了更直观地说明问题,所有实例中的SQL运行时间均经过测试,不超过1秒的均表示为(1秒).一、不合理的索引设计例:表record有620000行,试看在不同的索引下,下面几个SQL的运行情况:1.在date上建有一非个群集索引select count(*) from record where date>'19991201'and date < '19991214' and amoun > 2000 --------- (25秒)select date,sum(amount) from record group by date --------- (55秒)select count(*) from record where date>'19990901' and place in ('BJ','SH') --------- (27秒)分析:date上有大量的重复值,在非群集索引下,数据在物理上随机存放在数据页上,在范围查找时,必须执行一次表扫描才能找到这一范围内的全部行.2.在date上的一个群集索引select count(*) from record where date > '19991201'and date < '19991214' and amount > 2000 ---------(14秒)select date,sum(amount) from record group by date ---------(28秒)select count(*) from record where date > '19990901' and place in ('BJ','SH') ---------(14秒)分析:在群集索引下,数据在物理上按顺序在数据页上,重复值也排列在一起,因而在范围查找时,可以先找到这个范围的起末点,且只在这个范围内扫描数据页,避免了大范围扫描,提高了查询速度.3.在place,date,amount上的组合索引select count(*) from record where date > '19991201' and date < '19991214' and amount > 2000 –(26秒) select date,sum(amount) from record group by date---------(27秒)select count(*) from record where date > '19990901' and place in ('BJ, 'SH') --------- (1秒)分析:这是一个不很合理的组合索引,因为它的前导列是place,第一和第二条SQL没有引用place,因此也没有利用上索引;第三个SQL使用了place,且引用的所有列都包含在组合索引中,形成了索引覆盖,所以它的速度是非常快的.4.在date,place,amount上的组合索引select count(*) from record where date > '19991201' and date <'19991214' and amount>2000----( 1秒) select date,sum(amount) from record group by date --------- (11秒)select count(*) from record where date>'19990901' and place in ('BJ','SH') --------- (1秒)分析:这是一个合理的组合索引.它将date作为前导列,使每个SQL都可以利用索引,并且在第一和第三个SQL中形成了索引覆盖,因而性能达到了最优.5.总结:缺省情况下建立的索引是非群集索引,但有时它并不是最佳的;合理的索引设计要建立在对各种查询的分析和预测上.一般来说:①.有大量重复值、且经常有范围查询(between, >,< ,>=,< =)和order by、group by发生的列,可考虑建立群集索引;②.经常同时存取多列,且每列都含有重复值可考虑建立组合索引;③.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列.二、不充份的连接条件:例:表card有7896行,在card_no上有一个非聚集索引,表account有191122行,在account_no 上有一个非聚集索引,试看在不同的表连接条件下,两个SQL的执行情况:select sum(a.amount) from account a,card b where a.card_no = b.card_no-------- (20秒)将SQL改为:select sum(a.amount) from account a,card b where a.card_no = b.card_no and a.account_no=b.account_no-------- ( 1秒)分析:在第一个连接条件下,最佳查询方案是将account作外层表,card作内层表,利用card上的索引,其I/O次数可由以下公式估算为:外层表account上的22541页+(外层表account的191122行*内层表card上对应外层表第一行所要查找的3页)=595907次I/O在第二个连接条件下,最佳查询方案是将card作外层表,account作内层表,利用account上的索引,其I/O次数可由以下公式估算为:外层表card上的1944页+(外层表card的7896行*内层表account上对应外层表每一行所要查找的4页)= 33528次I/O可见,只有充份的连接条件,真正的最佳方案才会被执行.总结:1.多表操作在被实际执行前,查询优化器会根据连接条件,列出几组可能的连接方案并从中找出系统开销最小的最佳方案.连接条件要充份考虑带有索引的表、行数多的表;内外表的选择可由公式:外层表中的匹配行数*内层表中每一次查找的次数确定,乘积最小为最佳方案.2.查看执行方案的方法用set showplanon,打开showplan选项,就可以看到连接顺序、使用何种索引的信息;想看更详细的信息,需用sa角色执行dbcc(3604,310,302).三、不可优化的where子句1.例:下列SQL条件语句中的列都建有恰当的索引,但执行速度却非常慢:select * from record wheresubstring(card_no,1,4)='5378'-------- (13秒)select * from record where amount/30 < 1000-------- (11秒)select * from record where convert(char(10),date,112)='19991201'-------- (10秒)分析:where子句中对列的任何操作结果都是在SQL运行时逐列计算得到的,因此它不得不进行表搜索,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被SQL 优化器优化,使用索引,避免表搜索,因此将SQL重写成下面这样:select * from record where card_no like '5378%'-------- (1秒)select * from record where amount < 1000*30--------(11秒)select * from record where date= '1999/12/01'-------- ( 1秒)你会发现SQL明显快起来!2.例:表stuff有200000行,id_no上有非群集索引,请看下面这个SQL:select count(*) from stuff where id_no in('0','1') -------- (23秒)分析:where条件中的'in'在逻辑上相当于'or',所以语法分析器会将in ('0','1')转化为id_no ='0' or id_no='1'来执行.我们期望它会根据每个or子句分别查找,再将结果相加,这样可以利用id_no上的索引;但实际上(根据showplan),它却采用了&quot;OR策略&quot;,即先取出满足每个or子句的行,存入临时数据库的工作表中,再建立唯一索引以去掉重复行,最后从这个临时表中计算结果.因此,实际过程没有利用id_no上索引,并且完成时间还要受tempdb数据库性能的影响.实践证明,表的行数越多,工作表的性能就越差,当stuff有620000行时,执行时间竟达到220秒!还不如将or子句分开:select count(*) from stuff where id_no='0'select count(*) from stuff where id_no='1'得到两个结果,再作一次加法合算.因为每句都使用了索引,执行时间只有3秒,在620000行下,时间也只有4秒.或者,用更好的方法,写一个简单的存储过程:create proc count_stuff asdeclare @a intdeclare @b intdeclare @c intdeclare @d char(10)beginselect @a=count(*) from stuff where id_no='0'select @b=count(*) from stuff where id_no='1'endselect @c=@a+@bselect @d=convert(char(10),@c)print @d直接算出结果,执行时间同上面一样快!总结:可见,所谓优化即where子句利用了索引,不可优化即发生了表扫描或额外开销.1.任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边.2.in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引.3.要善于使用存储过程,它使SQL变得更加灵活和高效.从以上这些例子可以看出,SQL优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充份利用索引,减少表扫描的I/O次数,尽量避免表搜索的发生.其实SQL的性能优化是一个复杂的过程,上述这些只是在应用层次的一种体现,深入研究还会涉及数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计.。

oracle索引及使用原则

oracle索引及使用原则

oracle索引及使用原则一、索引类型B-tree indexes 平衡二叉树,缺省的索引类型B-tree cluster indexes cluster的索引类型Hash cluster indexes cluster的hash索引类型Global and local indexes 与patitioned table相关的索引Reverse key indexes Oracle Real Application Cluster使用Bitmap indexes 位图索引,索相列的值属于一个很小的范围Function-based indexes 基于函数的索引Domain indexes二、使用索引的原则尽量在插入数据完成后建立索引,因为索引将导致插入数据变慢,特别是唯一索引在正确的表和列上建索引优化索引列顺序提高性能限制每个表的索引个数删除不需要的索引指定索引的block设置估计索引的大小设置存储参数指定索引使用的表空间建索引时使用并行使用nologing建立索引二,各种索引使用场合及建议(1)B*Tree索引。

常规索引,多用于oltp系统,快速定位行,应建立于高cardinality列(即列的唯一值除以行数为一个很大的值,存在很少的相同值)。

Create index indexname on tablename(columnname[columnname...])(2)反向索引。

B*Tree的衍生产物,应用于特殊场合,在ops环境加序列增加的列上建立,不适合做区域扫描。

Create index indexname on tablename(columnname[columnname...]) reverse(3)降序索引。

B*Tree的衍生产物,应用于有降序排列的搜索语句中,索引中储存了降序排列的索引码,提供了快速的降序搜索。

Create index indexname on tablename(columnname DESC[columnname...])(4)位图索引。

面向对象数据库系统中的索引设计与优化

面向对象数据库系统中的索引设计与优化

面向对象数据库系统中的索引设计与优化在面向对象数据库系统中,索引是一项重要的组织和优化数据存储和访问的技术。

索引的设计和优化对于提高数据库的性能和效率具有关键性的影响。

本文将探讨面向对象数据库系统中索引的设计原则、常见优化技术以及如何选择适当的索引类型。

一、索引设计原则1. 唯一性:索引字段应该具有唯一性,确保每个索引值都是唯一的。

这可以通过为索引字段添加主键约束或唯一约束来实现。

2. 关键性:索引字段应该是关键字段,即经常被用于查询和排序的字段。

通常,与频繁出现在where子句或order by子句中的字段相关联的索引可以提升查询性能。

3. 多列索引:对多个字段进行组合索引,可以进一步提高查询效率。

但是,需要权衡索引的长度和查询的复杂性。

不宜过多的组合索引,以避免索引冗余。

4. 选择合适的数据结构:根据具体的需求和数据特点,选择合适的索引数据结构。

常用的索引数据结构包括B树、B+树和哈希索引。

B树适用于范围查询,B+树适用于范围查询和排序,哈希索引适用于等值查询。

二、索引优化技术1. 索引覆盖(Covering Index):通过创建包含所有需要的查询字段的索引,可以避免查询操作需要访问主表的磁盘块。

这样可以大大减少磁盘访问次数,提高查询性能。

2. 索引分区(Index Partitioning):将大型索引分割成多个较小的索引分区,可以提高索引的维护效率。

每个分区可以独立地进行维护操作,减小了锁竞争和资源争用。

3. 索引压缩(Index Compression):通过对索引数据进行压缩,可以减少磁盘空间的占用,提高索引读取速度。

常见的索引压缩算法有前缀压缩、字典压缩和位图压缩。

4. 索引碎片整理(Index Defragmentation):索引在进行增删改操作后可能会产生碎片,导致索引树结构不连续,降低了查询性能。

通过定期进行索引碎片整理,可以提高索引的连续性和性能。

三、选择适当的索引类型1. 普通索引(Normal Index):普通索引可以加快查询的速度,但不对数据的唯一性进行强制规定。

Oracle的性能优化

Oracle的性能优化

千里之行,始于足下。

Oracle的性能优化
Oracle的性能优化是提高数据库系统性能和响应速度的关键步骤,可以通
过如下几个方面进行优化:
1. 数据库设计和规范化:合理的数据库设计和良好的规范化可以减少数据冗余,提高查询效率,避免数据冲突和不一致。

2. 索引优化:在频繁查询的字段上创建适当的索引,可以加快查询速度。

但是,索引不宜过多,因为它们会增加数据修改和插入的时间。

3. 查询优化:优化查询语句的执行计划,使用正确的连接方法(如内连接、外连接),避免全表扫描。

4. 硬件升级:增加内存、硬盘和处理器等硬件资源,可以显著提高
Oracle数据库的性能。

5. 优化配置参数:根据数据库的特点和应用的需求,调整数据库的配置参数,例如SGA大小、PGA大小、日志文件大小等,以提高性能。

6. 数据库优化:使用合适的数据库特性,如分区表、分区索引、物化视图等,优化数据库的存储和查询效率。

7. 监控和调优:持续监控数据库的性能指标,如CPU利用率、内存使用率、磁盘IO等,并及时进行适当的调优操作。

第1页/共2页
锲而不舍,金石可镂。

总体来说,Oracle的性能优化需要综合考虑数据库设计、硬件配置、查询优化和系统监控等多个方面,通过不断的调整和优化,提高数据库的性能和响应速度。

oracle 索引 添加 原则

oracle 索引 添加 原则

oracle 索引添加原则索引是数据库中一种重要的对象,对于查询和数据的获取过程有着重要的作用。

因此,对于索引的添加原则必须要有所掌握。

本文将从以下几个方面来探讨oracle索引的添加原则。

一、索引的选择原则oracle索引添加的第一原则是选择合适的索引。

选择合适的索引需要考虑到几个因素:(1)数据的唯一性。

如果数据具有唯一性,就应该选择唯一性索引。

否则如果选择非唯一性索引,则会导致性能的降低。

(2)数据类型。

索引的类型要根据数据类型来选择。

(3)数据分布情况。

如果数据分布均匀,就不应该建立索引。

反之,如果数据分布极不均匀,就应该建立索引。

(4)数据访问方式。

建立索引时要综合考虑数据的访问方式,避免创建不必要的索引。

二、索引的原则索引的主键是数据库的一个关键组件,要遵循以下几个原则:(1)保证索引的唯一性。

主键索引必须保证数据的唯一性,避免出现重复数据的情况。

(2)保证索引的稳定性。

主键索引一旦建立后,就不能轻易地修改或者删除。

否则会影响数据库的稳定性。

(3)保证索引的实用性。

主键索引必须要实用,要符合数据库的实际情况。

否则建立了没有意义的主键索引,会浪费资源和时间。

三、索引的创建原则在创建索引时,需要考虑以下几个方面:(1)尽量选择合适的列作为索引列。

一般来说,主键列和外键列都可以作为索引列。

(2)对于最常用的搜索条件,建立特殊索引。

例如:联合索引、覆盖索引、分区索引等等。

(3)在建立索引时,需要注意索引的长度。

索引长度过长会导致查询速度变慢。

(4)建立索引前,需要考虑到表中数据的行数。

如果数据行数较少,不建议建立索引。

(5)建立索引后,需要定期维护和优化索引。

需要经常性的清除索引空间,以提高查询效率。

四、批量删除索引的原则删除索引是在数据库中进行维护和优化的重要工作,但需要遵循以下几个原则:(1)避免错误删除索引。

在删除索引前,需要卸载外键和约束。

(2)删除索引前,要确保需要删除的索引没有任何数据依赖关系。

oracle索引建立原则

oracle索引建立原则

oracle索引建立原则
索引是数据库中一种很重要的数据结构,能够提高查询速度和性能。

在Oracle数据库中,索引的建立需要遵循一定的原则。

1. 针对查询频率高的列建立索引
对于经常被查询的列,建立索引能够大大提高查询速度和效率。

在数据库设计时,需要考虑到经常被查询的列,如主键列、外键列、经常作为查询条件的列等,都需要建立索引。

2. 避免对小表建立索引
对于小表来说,建立索引可能会降低性能而不是提高性能。

因为小表的数据量很少,查询速度本来就很快,如果再建立索引,反而会增加额外的开销,降低性能。

3. 建立复合索引
复合索引是指建立在多个列上的索引。

如果在查询中需要同时使用多个列作为查询条件,建立复合索引能够大大提高查询效率。

但是需要注意,复合索引的列顺序需要考虑到查询中的顺序,才能最大程度地提高查询效率。

4. 避免对频繁更新的列建立索引
对于频繁更新的列,如时间戳、日志等,建立索引会增加额外的开销,降低性能。

因此,在设计表结构时,需要根据实际情况选择是否建立索引。

5. 定期维护索引
索引是需要定期维护的,因为索引随着数据库的使用而变得越来
越庞大,可能会导致查询性能下降。

定期维护索引可以删除不必要的索引、优化索引等,提高查询性能。

总之,在Oracle数据库中,索引的建立需要根据实际情况进行,需要考虑到查询频率、表大小、列的更新频率等因素,才能最大程度地提高查询效率和性能。

53个ORAQCLE 语句优化规则

53个ORAQCLE 语句优化规则

53个Oracle语句优化规则详解1.选用适合的Oracle优化器Oracle的优化器共有3种:a.RULE(基于规则) b.COST(基于成本)c.CHOOSE(选择性)设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE、COST、CHOOSE、ALL_ROWS、FIRST_ROWS。

你当然也在SQL句级或是会话(session)级对其进行覆盖。

为了使用基于成本的优化器(CBO,Cost-Based Optimizer),你必须经常运行analyze命令,以增加数据库中的对象统计信息(object statistics)的准确性。

如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关。

如果table已经被analyze过,优化器模式将自动成为CBO,反之,数据库将采用RULE形式的优化器。

在缺省情况下,Oracle采用CHOOSE优化器,为了避免那些不必要的全表扫描(full table scan),你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。

2.访问Table的方式Oracle采用两种访问表中记录的方式:a.全表扫描全表扫描就是顺序地访问表中每条记录。

Oracle采用一次读入多个数据块(database block)的方式优化全表扫描。

b. 通过ROWID访问表你可以采用基于ROWID的访问方式情况,提高访问表的效率,ROWID包含了表中记录的物理位置信息……Oracle采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系。

通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高。

3.共享SQL语句为了不重复解析相同的SQL语句,在第一次解析之后,Oracle将SQL语句存放在内存中。

这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。

数据库索引优化总结

数据库索引优化总结

数据库索引优化总结在数据库管理和应用中,索引优化是一项至关重要的任务,它能够显著提高数据库的查询性能,减少数据检索的时间和资源消耗。

然而,要实现有效的索引优化并非一蹴而就,需要深入理解数据库的工作原理以及索引的特性。

一、索引的基本概念索引就像是一本书的目录,它能够帮助数据库快速定位和检索数据。

通过在特定的列上创建索引,数据库可以更快地找到与查询条件匹配的数据行,而无需扫描整个表。

常见的索引类型包括 B 树索引、哈希索引等。

B 树索引是大多数关系型数据库中常用的索引类型。

它是一种平衡的多路搜索树结构,能够在查找、插入和删除操作中保持较好的性能。

哈希索引则适用于等值查询,但对于范围查询和排序的支持相对较弱。

二、索引的优点1、提高查询速度这是索引最显著的优点。

当数据库执行查询操作时,如果查询条件涉及到索引列,数据库可以直接通过索引快速定位到符合条件的数据,而不必扫描整个表,从而大大提高了查询效率。

2、加快数据排序如果查询需要对数据进行排序,并且排序的列上有索引,数据库可以利用索引的有序性来加速排序过程,减少排序操作的时间开销。

3、增强数据唯一性约束在索引列上可以定义唯一性约束,确保该列的值不重复,从而保证数据的完整性和一致性。

三、索引的缺点1、增加数据插入、更新和删除的开销当对表中的数据进行插入、更新或删除操作时,如果这些操作涉及到索引列,数据库不仅要修改表中的数据,还要同时维护索引的结构,这会增加额外的时间和资源消耗。

2、占用存储空间索引需要额外的存储空间来存储索引结构和索引列的值,这可能会导致数据库存储空间的增加。

3、可能导致查询性能下降如果创建了过多或不合理的索引,数据库在进行查询优化时可能会选择错误的索引,从而导致查询性能下降。

四、索引优化的原则1、选择合适的列创建索引通常,应该在经常用于查询、连接、排序和分组操作的列上创建索引。

例如,主键、外键、经常用于条件判断的列等。

但对于很少使用或数据分布非常不均匀的列,创建索引可能效果不佳。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

索引优化规则:
1. like件中不要以通配符(WILDCARD)开始,否则索引将不被采用.
例:SELECT LODGING FROM LODGING
WHERE MANAGER LIKE ‘%HANMAN';
2.避免在索引列上使用计算或改变索引列的类型或使用‘!=’及<>
例: SELECT …FROM DEPT WHERE SAL * 12 > 25000;
SELECT … FROM EMP WHERE EMP_TYPE=to_char(123);
select …. Where ACCOUNT_NAME||ACCOUNT_TYPE='AMEXA';
select …where empno!=8888 ;
3.避免在索引列上使用NOT .
4.用>=替代> .
高效: SELECT * FROM EMP WHERE DEPTNO >=4
低效: SELECT * FROM EMP WHERE DEPTNO >3
两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.
•5.用UNION替换OR (适用于索引列)
• 通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上只针对多个索引列有效. 如果有column 没有被索引, 查询效率可能会因为你没有选择O规则R而降低.
在下面的例子中, LOC_ID 和REGION上都建有索引.
高效:
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10
UNION
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE REGION = “MELBOURNE”
• 低效:
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10 OR REGION = “MELBOURNE”
如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面
• 注意:WHERE KEY1 = 10 (返回最少记录)
OR KEY2 = 20 (返回最多记录)
ORACLE 内部将以上转换为
WHERE KEY1 = 10 AND((NOT KEY1 = 10)AND KEY2 = 20)
6. 避免在索引列上使用IS NULL和IS NOT NULL
避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引.对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录.如果至少有一个列不为空,则记录存在于索引中.
(建议:可以给null值的字段设置一个默认值))
7. 如果索引是建立在多个列上,索引时段需要放在where 条件的第一个条件(Oracle8i之前),Oracle8i之后允许跳跃式索引.
8. (可能的话)用UNION-ALL 替换UNION.
UNION-ALL就是做简单的合并,不会进行排序,UNION先做简单的合并,然后做进行排序,最后去除重复的记录。

9.避免使用耗费资源的操作
带有DISTINCT,UNION ,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎.
执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序.
例如,一个UNION查询,其中每个查询都带有GROUP BY子句, GROUP BY会触发嵌入排序(NESTED SORT) ; 这样, 每个查询需要执行一次排序, 然后在执行UNION 时, 又一个唯一排序(SORT UNIQUE)操作被执行而且它只能在前面的嵌入排序结束后才能开始执行. 嵌入的排序的深度会大大影响查询的效率.
通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写.。

相关文档
最新文档