oracle语句怎么优化,Oracle优化语句
在开发后台程序中,怎么样优化你的SQL语句使得你的后台程序能达到⾼效的⽬的,当然通过搜索这类相关⽂章有很多很多,这⾥本⼈写的是通过项⽬中总结出的⼗⼤主要SQL性能优化,希望在开发中能给⼤家⼀定的参考。
下⾯的实例中使⽤3个表 (TABLE) A(R1,R2,R3,R4,R5,C1,C2,B2) B(R1,B1,B2) C(R1,C1,C2,B2),括号中即为表中的字段。
⼀、使⽤特定表中的索引。
有时候⼀个表中的数据量很⼤时候,索引是⾮常⾮常的重要,何为索引?我来举个例⼦,你⼀听就能明⽩,⽐如:你想搜索我的电脑中⼀个名字为FILE.TXT⽂件,如果不知道该⽂件所在的⽬录(没有创建索引)情况下,基本上要扫描我的电脑中的所有盘符⾥的⽂件,如果你的硬盘中的有很多⽂件(相当⼀个表中有很多的数据),基本上是⼀个全盘扫描的过程,这时如果你告诉搜索,你的⽂件就在D盘的TEST⽬录下,这样来搜索速度将会⼤⼤的提⾼,给⽂件定位就相当⼀个索引。
好了,知道索引是⼲什么之后,下⾯来看看怎么⾛正确的索引,才能达到最⾼效。假如A表中有两个索引IDX_R1
INDEX(R1,R2,R4,R5),IDX_R3 INDEX(R1,R3,R4,R5) 现在需要做这样的操作,显⽰表中的条件值是R1 = 1,R3 = 3,R4 =4的所有内容。通常我们会写出下⾯的查询语句。
select * from A where R1 =1 and R3 =3 and R4;
按道理它⾛的索引是IDX_R3,有时候默认⾛的索引并不是你想象中的那样,特别是多表关联的情况下。所以我们进⾏指定⼀下索引,按我们真正想要的⾛的索引:
select /*+ index(R1,IDX_R3) */* from A where R1 =1 and R3 =3 and R4;
⼆、在检索数据的时候两个表的关联查询效率低于使⽤EXISTS⼦句。
SELECT B.R1,B.B1,B.B2 FROM A,B WHERE A.R1 = B.R1;
优化为:
SELECT B.R1,B.B1,B.B2 FROM B WHERE EXISTS(SELECT 1 FROM A WHERE A.R1 = B.R1);
如果你在WINDOWS的ORACLE的平台可以使⽤PL/SQL中的执⾏计划(EXPLAIN PLAN),看⼀下相应的执⾏时间进⾏验证。
三、ORACLE的解析器是由右向左进⾏解析,所以在检索两个或以上表相关联的数据的时候,将数据量⼩的表放到最后让解析器优先解析。此⽅法在两个表的数据相差很⼤的情况下,会有点效果。
四、 使⽤EXISTS代替IN⼦句,同理⽤NOT EXISTS 代替NOT IN
因为使⽤IN⼦句作为⼀个查询条件后,ORACLE会将IN⼦句的数据先搜索出来以后,等结果集返回以后才作为⼀个条件值。⽽EXISTS语句是WHERE语句之前的数据优先检索完后在去检索EXISTS⼦句的内容。
五、如果有⼦句⽐较的情况下,将此⽐较语句放到WHERE后作为第⼀个条件。
如:
SELECT A.R2 FROM A WHERE B.B2 = 3 AND 2< SELECT COUNT(1) FROM B WHERE B.R1 = A.R1; //效率较低
SELECT A.R2 FROM A WHERE 2< SELECT COUNT(1) FROM B WHERE B.R1 = A.R1 AND B.B2 = 3; //效率较⾼
六、在写存储过程的时候,⽆论是执⾏UPDATE,还是执⾏INSERT,应该尽快的COMMIT。
七、在执⾏数据检索的过程中近可能少的访问同⼀个表。
在写存储过程的时候,有时候因为条件值不⼀样,通常需要多次的去访问同⼀个表,这个时候可以考虑⼀个使⽤DECODE函数来代替多个条件。
//1
SELECT SUM(Nvl(C2,0)) FROM C WHERE R1 = 12 AND C1 = 22 ;
//2
SELECT SUM(Nvl(C2,0)) FROM C WHERE R1 = 12 AND C1 = 33 ;
优化⽅法:
SELECT SUM(DECODE(C1,22,C2,33,C2,0) FROM C WHERE R1 =12 AND C1 IN(22,33);⼋、在写条件的时候尽量在条件值的左边使⽤函数。
如:
SELECT * FROM A WHERE TO_CHAR(R5,'YYYYMM') = '200804'
应该使⽤
SELECT * FROM A WHERE R5 = TO_DATE('200804','YYYYMM');代替
九、UPDATE语句写法提⾼效率。
UPDATE A
SET C2 = (SELECT MAX(C2) FROM C),
B2 = (SELECT MAX(B2) FROM C)
WHERE R1 = 1000;
⾼效:
UPDATE A
SET (C2, B2)
= (SELECT MAX(C2) , MAX(B2)
FROM C)
WHERE R1 = 1000;
⼗、⽤EXISTS替换DISTINCT.
例如:
//低效:
SELECT DISTINCT C.R1,C.B2
sql语句优化方式FROM A,C
WHERE A.R1 = C.R1 ;
//⾼效:
SELECT C.R1,C.B2
FROM C
WHERE EXISTS ( SELECT ‘X’
FROM A
WHERE A.R1 = C.R1);
EXISTS 使查询更为迅速,因为RDBMS核⼼模块将在⼦查询的条件⼀旦满⾜后,⽴刻返回结果.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论