Oracle数据库的SQL语句优化

2 1 年 第 3期 01
文章 编 号 :06 7 (0 )30 2 -3 10 24 5 2 1 0 -140 1
汁 算 机 现 代 化 J U N IY I N AHU I A J U XA D I A S
总第 17期 8
O al 数 据 库 的 S L语 句 优 化 rc e Q
2 Wu a o gu If m t nT c n l yC . Ld , h n4 0 7 , hn ) . h nH n x n r ai e h oo o, t. Wu a 3 0 4 C i o o g a
Ab t a t I aa a e a p ia in s se ,p r r n e b c me n ft erman p o lms n e e o b e o v d w t h n sr c :n d t b s p l t y tms e o ma c e o s o e o i c o f h i r b e e d d t e r s le i t e i — h
钟小 权 叶 , 猛
( . 汉邮 电科 学 研 究 院研 究 生 院 , 北 武 汉 40 7 ; . 1武 湖 3 04 2 武汉 虹 旭 信 息技 术 有 限 责 任 公 司 , 北 武 汉 40 7 ) 湖 30 4 摘 要 : 着数 据 库 应 用 系统 中数 据 的增 加 , 随 系统 的性 能提 高成 为 数 据 库 系 统 中需 要 解 决 的 主 要 问 题 , 系统 硬 件 不 变 的 在 情 况 下 ,Q S L语 句 的 优化 成为 系统性 能提 高 的 主要 途 径 。 本 文通 过 分 析 O al 数 据 库 执 行 S L语 句 的 过 程 , 用 比 较 rc e Q 采 S L语 句优 化 之 前 和优 化之 后 的执 行 时 间和 调 用 的 数据 块数 量 方 法 来 判 断 优 化 效 果 , Q 最后 得 到 消耗 时 间 少和 调 用数 据 块 少 的 S L语 句。 Q
S Ls t eth ti ecnu igl saddt bokc l gl s Q te n ta t osmn s n a l a i s. a m m e a c ln e
Ke y wor ds: a l a a s Or ce d tba e:o tmiai n; o tmie p i z to pi z r;i e nd x
ces f a .T eot i t no S Lsnec sam i w yt po t tepr r ac ess m u dr h a e raeo dt i i h pi z i Q etnei a a r e h e om neo t yt ne esm an t m ao f n o mo f f h e t hrw r o d i . hs ae nlzs h eui r ess f Q nee rc aaae cmprsh xct nt e ad a cn io T ippr a e ee ct npo s Ls t enOal dt s, o ae t eeui m e tn a y t x o c e oS e n i e b e o i
a d n mb ro aa bo k a e n b fr n f ro p i z t n t ee mi e t e o t le e t i al h a e es t e n u e fd t lc s e H d i eo e a d at fo t e miai o d tr n h p i f c .F n l o ma y,t e p p rg t h
Opi z t no QL S ne c o a l Daa a e t ai f mi o S e tn efrOr ce tb s
ZHONG a u n Xio q a ,YE M e g n
( . r ut Sho, hnR sac ntu f ota dTlcm u i t n , hn4 07 , hn ; 1Ga a c ol Wu a eer Istt o s n e o m nc i s Wua 30 4 C i d e h ie P s e ao a
体 上看 调优 是 对 各 个 组 件 的优 化 , 括 应用 程 序 优 包
化、 实例 和数 据库优 化和环 境优化 。对 应用程 序 的优
服务器 ) 。当服务 器进程 接收 到用户 进程提 交的 S L Q 语句 时 , 服务 器 进 程 会 对 S L语 句 进 行 语 法 和 词 法 Q 分析 。检查通 过 后 , 务 器 进程 会 将 S L语 句 转 变 服 Q 为 A CI , S I码 并通 过 一 个 Hah函数 将 A CI 生 成 s S I码 Hs ah值 , 务 器 进 程 会 到 系统 全 局 区 S A( ytm 服 G Ss e
关 键 词 : r l 据 库 ; 化 ; 化 器 ;索 引 O a e数 c 优 优
中 图分 类 号 : P 1 . 3 T 3 I 1 文 献 标 识 码 : A d i 0 3 6 / .sn 10 — 7 . 0 1 0 . 3 o :1 .9 9 ji . 0 62 5 2 1 . 3 0 5 s 4
O 引 言
对 O al rc e数据库 的 调优 是进 行 有 目的 的调 组
句 的执 行 过程 。O al 为每 个 用 户进 程 分 配 一 个 rc e会 服务器 进程 ( 际 情 况 应 该 区分 专 用 服 务 器 和 共 享 实
件 以改善 性 能 , 即增加 吞 吐量和减 少响 应时 间。从 整
合集下载

OracleSQL性能优化及案例分析

OracleSQL性能优化及案例分析

OracleSQL性能优化及案例分析标题:Oracle SQL性能优化及案例分析一、引言Oracle数据库作为全球最受欢迎的数据库之一,其性能优化问题一直是用户和开发者的焦点。

尤其是在处理大量数据或复杂查询时,性能问题可能会严重影响应用程序的响应时间和用户体验。

因此,对Oracle SQL进行性能优化及案例分析显得尤为重要。

二、Oracle SQL性能优化1、索引优化索引是提高Oracle SQL查询性能的重要工具。

通过创建合适的索引,可以大大减少查询所需的时间,提高数据库的响应速度。

然而,过多的索引可能会导致额外的存储空间和插入、更新、删除的性能损失。

因此,需要根据实际应用的需求,合理地选择需要索引的字段。

2、查询优化编写高效的SQL查询语句也是提高Oracle SQL性能的关键。

这包括选择正确的查询语句、避免在查询中使用复杂的子查询、使用连接(JOIN)代替子查询等。

还可以使用Oracle SQL Profiler来分析和优化查询语句的性能。

3、数据库参数优化Oracle数据库有许多参数可以影响SQL性能,如内存缓冲区、磁盘I/O参数等。

根据实际应用的需求和硬件环境,对这些参数进行合理的调整,可以提高Oracle SQL的性能。

三、案例分析1、案例一:索引优化问题描述:在一个电商系统中,用户在搜索产品时,使用全文本搜索功能时经常出现延迟。

解决方案:通过分析用户搜索的习惯和需求,对产品表的名称和描述字段创建全文索引。

同时,调整Oracle的全文搜索参数以提高搜索效率。

2、案例二:查询优化问题描述:在一个银行系统中,客户查询自己的贷款信息时,查询时间过长。

解决方案:通过使用Oracle SQL Profiler分析查询语句,发现查询中存在复杂的子查询。

将子查询改为连接(JOIN)方式,减少了查询时间。

3、案例三:数据库参数优化问题描述:在一个大型电商系统中,用户在访问高峰期经常遇到响应时间过长的问题。

oracle性能优化,SQL语句全优化,SQL语句执行效率问题

oracle性能优化,SQL语句全优化,SQL语句执行效率问题

oracle性能优化,SQL语句全优化,SQL语句执行效率问题oracle性能优化文档共50条选择其中4条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)中的内存可以被所有的数据库用户共享. 因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执行路径. ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用. 可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询. 数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了. 当你向ORACLE 提交一个SQL语句,ORACLE会首先在这块内存中查找相同的语句. 这里需要注明的是,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等). 共享的语句必须满足三个条件:A. 字符级的比较: 当前被执行的语句和共享池中的语句必须完全相同. 例如:SELECT * FROM EMP;和下列每一个都不同SELECT * from EMP;Select * From Emp;SELECT * FROM EMP;B. 两个语句所指的对象必须完全相同: 例如:用户对象名如何访问Jack sal_limit private synonymWork_city public synonymPlant_detail public synonymJill sal_limit private synonymWork_city public synonymPlant_detail table owner考虑一下下列SQL语句能否在这两个用户之间共享.SQL 能否共享原因select max(sal_cap) from sal_limit 不能每个用户都有一个private synonym - sal_limit, 它们是不同的对象select count(*) from work_city where sdesc like 'NEW%' 能两个用户访问相同的对象public synonym - work_cityselect a.sdesc,b.location from work_city a , plant_detail b where a.city_id = b.city_id 不能用户jack 通过private synonym访问plant_detail 而jill 是表的所有者,对象不同C. 两个SQL语句中必须使用相同的名字的绑定变量(bind variables) 例如:第一组的两个SQL语句是相同的(可以共享),而第二组中的两个语句是不同的(即使在运行时,赋于不同的绑定变量相同的值)select pin , name from people where pin = :blk1.pin;select pin , name from people where pin = :blk1.pin;select pin , name from people where pin = :blk1.ot_ind;select pin , name from people where pin = :blk1.ov_ind;4. 选择基础表Oracle的SQL语句执行效率问题查找与解决方法一、识别占用资源较多的语句的方法(4种方法)1. 测试组和最终用户反馈的与反应缓慢有关的问题。

浅谈Oracle数据库SQL性能优化

浅谈Oracle数据库SQL性能优化

千里之行,始于足下。

浅谈Oracle数据库SQL性能优化
SQL性能优化在Oracle数据库中是非常重要的,并且是一个复杂而繁琐的过程。

下面是一些常见的SQL性能优化技巧。

1. 使用正确的索引:索引是加快查询速度的重要因素。

确保表中的列被正确索引,以便Oracle能够快速定位所需的数据。

2. 优化查询语句:编写高效的查询语句是提高性能的关键,避免使用大量的子查询、联合查询以及不必要的计算。

3. 提高表的设计:优化表的结构和设计,包括拆分表、合并表、垂直分区和水平分区等。

4. 使用合适的数据类型:使用合适的数据类型可以节省存储空间和提高查询效率。

5. 避免使用全表扫描:全表扫描是一种费时的操作,尽量避免使用它,使用索引或其他技术来提高查询效率。

6. 分析并优化执行计划:使用Oracle的性能分析工具来分析查询执行计划,找出慢查询的原因,并优化查询的执行计划。

7. 优化硬件和服务器配置:提高服务器的性能,如增加内存、优化磁盘和网络等。

8. 定期收集统计信息:定期收集表和索引的统计信息,以便Oracle优化查询的执行计划。

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

9. 使用缓存和预编译:使用数据库缓存和预编译技术来提高查询速度。

10. 并发控制:合理设计并发控制机制,避免不必要的锁和死锁,提高查询和更新的并发性能。

总之,SQL性能优化是一个综合性工作,需要深入了解Oracle数据库的架构和原理,并结合具体的业务场景进行优化。

通过合理的索引设计、优化查询语句、优化表设计以及优化硬件和服务器配置等手段,可以大大提高Oracle数据库的性能。

oracle Sql语句优化原则

oracle Sql语句优化原则

S ql语句优化原则一、优化原则1、避免使用硬编码,改用绑定变量实现。

举例:String str =’ select * from t_zx_ryjbxxb where xm=’+params;上面这条语句使用了硬编码,使用这种方式存在两方面问题:每次执行sql语句时都需要重新解析sql语句;可能会遭遇sql注入攻击。

如在上面的语句中输入张三' or 1='1,则会把所有的记录都显示出来。

解决的方法就是使用占位符代替硬编码。

如下:String str =’select * from t_zx_ryjbxxb where xm=?’;2、当插入的数据为数据表中的记录数量的10%以上,首先需要删除该表的索引来提高数据的插入效率,当数据插入后,再建立索引。

3、避免在索引列上使用函数或计算,在where子句中,如果索引是函数的一部分,优化器将不再使用索引而使用全表扫描。

举例:低效:select * from dept where sal*12 >2500;高效:select * from dept where sal>2500/12;4、避免在索引列上使用not和“!=”,索引只能告诉什么存在于表中,而不能告诉什么不存在于表中,当数据库遇到not 和“!=”时,就会停止使用索引而去执行全表扫描。

5、使用关联查询替代in ,可以提高查询的效率。

6、使用not exists子查询替代not in。

在子查询中,NOT IN子句将执行一个内部的排序和合并。

无论在哪种情况下,NOT IN都是最低效的(因为它对子查询中的表执行了一个全表遍历)。

为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.举例:select * from t_zx_ryjbxxb where rybh not in(select rybh from t_zx_cqrb) and jwh=''select * from t_zx_ryjbxxb a where not exists(select1from t_zx_cqrb b where a.rybh =b.rybh)使用union-all 替代union:当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并,然后在输出最终结果前进行排序。

Oracle 数据库SQL调优

Oracle 数据库SQL调优
概述
数据库的调优包括多个层面,如:操作系统调优、数据合理有效的存
储、数据库服务器参数调整、应用层调优等 对应用开发层的SQL的调优,是最直接有效的手段,可解决80%以上 对应用开发层的SQL的调优,是最直接有效的手段,可解决80%以上 的数据库访问效率问题 本次培训主要讲述一些书写高效SQL语句常用规则 本次培训主要讲述一些书写高效SQL语句常用规则
规则:总是使用索引的第一个列 规则:
如果索引是建立在多个列上(复合索引), 只有在它的第一个列 如果索引是建立在多个列上(复合索引),
(leading column)被where子句引用时,优化器才会选择使用该索引. column)被where子句引用时,优化器才会选择使用该索引. create table multiindexusage ( inda number , indb number , descr varchar2(10)); create index multindex on multiindexusage(inda,indb); 通过索引扫描: select * from multiindexusage where inda = 1; 全表扫描: select * from multiindexusage where indb = 1;
规则:合理有效的使用索引提高查询效率 规则:
在多数情况下,通过索引提高查询效率是非常有效的办法 索引一定要建的合理,并且被正确的使用 选择合适的索引列规则: 选择在where子句中常用的查询列做索引字段 选择在where子句中常用的查询列做索引字段 选择常用来关联表的字段做索引字段 对普通的B TREE索引,应该选择具有选择性高(high selectivity)的 对普通的B-TREE索引,应该选择具有选择性高(high selectivity)的 字段做索引字段,若字段的不同取值很少,即选择性低,则适合建位 图索引 不要在经常被修改的字段上建索引。索引会降低 update ,insert ,delete等操作的效率。 ,delete等操作的效率。

Oracle数据库的sql语句性能优化

Oracle数据库的sql语句性能优化

Oracle数据库的sql语句性能优化 在应⽤系统开发初期,由于开发数据库数据⽐较少,对于查询sql语句,复杂试图的编写等体会不出sql语句各种写法的性能优劣,但是如果将应⽤系统提交实际应⽤后,随着数据库中数据的增加,系统的响应速度就成为⽬前系统需要解决的最主要问题之⼀。

系统优化中⼀个很重要的⽅⾯就是sql语句的优化。

对于海量数据,劣质sql语句和优质sql语句之间的速度差别可以达到上百倍,可见对于⼀个系统不是简单地能实现其功能就⾏,⽽是要写出⾼质量的sql语句,提⾼系统的可⽤性。

Oracle的sql调优第⼀个复杂的主题,甚⾄需要长篇概论来介绍OracleSQL调优的细微差别。

不过有⼀些基本的规则是每个OracleDBA都需要遵从的,这些规则可以改善他们系统的性能。

sql调优的⽬标是简单的:消除不必要的⼤表全表搜索。

不必要的全表搜索导致⼤量不必要的磁盘I/O,从⽽拖慢整个数据库的性能,对于不必要的全表搜索来说,最常见的调优⽅法是增加索引,可以在表中加⼊标准的B树索引,也可以加⼊位图索引和基于函数的索引。

要决定是否消除⼀个全表搜索,你可以仔细检查索引搜索的I/O开销和全表搜索的开销,它们的开销和数据块的读取和可能的并⾏执⾏有关,并将两者作对⽐。

另外,在全表搜索是⼀个最快的访问⽅法时,将⼩表的全表搜索放到缓存(内存)中,也是⼀个⾮常明智的选择。

我们会发现现在诞⽣了很多基于内存的数据库管理系统,将整个数据库置于内存之中,性能将得到质的飞跃。

⼀、与索引相关的性能优化 在多数情况下,Oracle使⽤索引来更快地遍历表,优化器主要根据定义的索引来提⾼性能。

但是,如果在sql语句的where⼦句中写的sql代码不合理,就会造成优化器删去索引⽽使⽤全表扫描,⼀般这种sql语句就是所谓的劣质sql语句。

在编写sql语句时我们应清楚优化器根据何种原则来删除索引,这有助于写出⾼性能的sql语句。

1.IS NULL 与 IS NOT NULL 不能⽤null做索引,任何包含null值的列都将不会被包含在索引中,即使索引有多列这样的情况下,只要这些列中有⼀列含有null,该列就会从索引中排除。

Oracle sql 性能优化调整

Oracle sql 性能优化调整一、前言Oracle SQL是众多企业使用较多的关系型数据库之一,因其高效稳定的性能,以及其提供的强大功能,逐渐成为了广大企业进行信息系统开发、实施和数据管理的首选。

然而,在大数据时代,普通的SQL查询已经不能支撑企业的业务需求,尤其是在数据量庞大的情况下,SQL查询的效率和性能将会受到严重的制约。

本文旨在介绍Oracle SQL的性能优化调整方法,以提高企业的数据处理的效率和性能。

二、排查问题SQL性能优化的第一步是排查问题,需要对慢查询做出明确的定位。

首先需要对SQL进行分析,寻找哪个部分影响了SQL性能,包括:1.查询语句的风格是否规范。

2.SQL语句是否能够使用索引优化查询。

3.数据库的表大小是否合适。

4.缓存的大小是否合适。

5.应用响应时间是否过长。

在分析完成后,才能通过性能优化来解决问题。

三、优化处理1.优化SQL查询语句SQL查询最主要的性能瓶颈是IO瓶颈。

当表的大小超过1万条时,应该对查询语句进行合理的检索,即避免全表扫描。

对大于1万条的表,应该创建索引,以便提高SQL的效率。

2.优化SQL查询计划查询计划优化是SQL调优的关键。

因为优化查询计划是确定整个查询需要的资源和查询的优化路径。

优化查询计划意味着查询应该从哪些索引开始,除了哪些索引以外,以及使用哪些操作符等等。

这些优化计划将明显影响查询性能。

3.优化表结构和索引优化表结构和索引也是常用的Oracle SQL优化方法。

表结构的优化主要是考虑数据库表的设计是否符合0NF、1NF、3NF等规范,是否有多列重复,是否存在无用列,是否存在大型BLOB/CLOB列等问题。

对于索引优化,可以使用多个单列索引代替多列复合索引以提高查询更新效率。

此外,还可以考虑使用等值连接或外连接改变查询本身,以便减少查询的数据量。

4.优化服务器硬件和操作系统软件硬件和操作系统软件的优化也很重要,因为数据库运行的效率和性能取决于服务器硬件和操作系统软件是否能够同时支持PMI和CPU等高性能功能。

oracleSQL语句的优化方法(hints)


<10>. /*+INDEX_COMBINE*/
为指定表选择位图访问路经,如果INDEX_COMBINE中没有提供作为参数的索引,将选择出位图索引的
布尔组合方式.
例如:
SELECT /*+INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI)*/ * FROM BSEMPMS
<9>. /*+INDEX_ASC(TABLE INDEX_NAME)*/
表明对表选择索引升序的扫描方法.
例如:
SELECT /*+INDEX_ASC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO=“CCBZZP“;
例如:
SELECT /*+CLUSTER */ BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS
WHERE DPT_NO=“TEC304“ AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
<8>. /*+INDEX(TABLE INDEX_NAME)*/
<20>. /*+NO_MERGE(TABLE)*/
对于有可合并的视图不再合并.
例如:
SELECT /*+NO_MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELET DPT_NO,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO AND A.SAL>V.AVG_SAL;

oracle数据库sql优化方案

oracle数据库sql优化方案概述:在使用Oracle数据库进行开发和运维过程中,SQL语句的性能常常是一个关键问题。

本文将介绍一些基本的Oracle数据库SQL优化方案,旨在提高系统查询性能和响应速度。

1. SQL语句优化准则在进行SQL语句的优化之前,我们需要遵循以下准则:- 减少表之间的连接数量,尽量使用JOIN语句而不是子查询。

- 选择恰当的索引,合理利用索引可以提高查询效率。

- 避免使用SELECT *,仅选择需要的列。

- 尽量减少SQL语句中的函数使用,函数会增加查询的开销。

- 针对复杂查询,可以考虑使用分页查询或数据缓存等技术。

2. 查询计划分析查询计划是Oracle数据库优化的重要工具,通过分析查询计划可以找到潜在的性能问题。

可以使用以下工具进行查询计划分析:- 使用EXPLAIN PLAN命令生成查询计划。

- 使用SQL Trace功能记录SQL执行过程,通过跟踪文件进行分析。

- 使用Oracle Enterprise Manager等性能监控工具,查看查询计划和执行统计信息。

3. 索引优化索引是提高查询性能的重要手段,合理使用和优化索引可以显著提升系统的响应速度。

以下是一些索引优化的常用技巧:- 使用唯一索引替代非唯一索引,减少索引的冗余。

- 避免在过大的列上创建索引,可以使用函数索引或局部索引进行优化。

- 对经常用于查询的列创建索引,包括WHERE子句中经常使用的列和经常进行连接的列。

- 定期进行索引重建和统计信息收集。

4. 数据库配置优化除了对SQL语句进行优化,还可以通过调整数据库配置来提升性能:- 合理设置数据库的内存参数,包括共享池大小、缓冲池大小和PGA大小等。

- 设置适当的并发连接数,避免过度连接造成资源浪费。

- 配置硬盘存储方式,使用RAID技术提高数据存取速度。

- 使用数据库分区技术,将大表分成多个子表,提高查询效率。

5. 常见问题处理在优化SQL过程中,经常会遇到一些常见的性能问题,以下是一些处理方式:- 大数据量查询问题:可以考虑分页查询、增加合适的索引或引入缓存等手段来解决。

Oracle的SQL语句优化

Oracle的SQL语句优化一、操作符优化1、IN 操作符用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。

但是用IN的SQL性能总是比较低的,从Oracle执行的步骤来分析用IN的SQL 与不用IN的SQL有以下区别:ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。

由此可见用IN的SQL至少多了一个转换的过程。

一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。

推荐方案:在业务密集的SQL当中尽量不采用IN操作符,用EXISTS 方案代替。

2、NOT IN操作符此操作是强列不推荐使用的,因为它不能应用表的索引。

推荐方案:用NOT EXISTS 方案代替3、IS NULL 或IS NOT NULL操作(判断字段是否为空)判断字段是否为空一般是不会应用索引的,因为索引是不索引空值的。

推荐方案:用其它相同功能的操作运算代替,如:a is not null 改为a>0 或a>’’等。

不允许字段为空,而用一个缺省值代替空值,如申请中状态字段不允许为空,缺省为申请。

4、> 及< 操作符(大于或小于操作符)大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找,但有的情况下可以对它进行优化,如一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。

那么执行A>2与A>=3的效果就有很大的区别了,因为A>2时ORACLE会先找出为2的记录索引再进行比较,而A>=3时ORACLE则直接找到=3的记录索引。

5、LIKE操作符LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,如LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。

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