研讨linux下C/C++,GTK,Shell,Oracle
(原创)Oracle中SQL语句的十大优化
上一篇 /
下一篇 2008-04-21 17:36:28
/ 个人分类:Oracle
a9BL6fU"k$J0 在开发后台程序中,怎么样优化你的SQL语句使得你的后台程序能达到高效的目的,当然通过搜索这类相关文章有很多很多,这里本人写的是通过项目中总结出的十大主要SQL性能优化,希望在开发中能给大家一定的参考。
ej-]?;{{(ad1T0Linux宝库a{H6?o.lpW以下的实例中使用3个表 (TABLE) A(R1,R2,R3,R4,R5,C1,C2,B2) B(R1,B1,B2) C(R1,C1,C2,B2),括号中即为表中的字段
onxT:zE)G6M0BSF+r9n0一、使用特定表中的索引。Linux宝库,O"X q _g2UC
有时候一个表中的数据量很大时候,索引是非常非常的重要,何为索引?我来举个例子,你一听就能明白,比如:你想搜索我的电脑中一个名字为FILE.TXT文件,如果不知道该文件所在的目录(没有创建索引)情况下,基本上要扫描我的电脑中的所有盘符里的文件,如果你的硬盘中的有很多文件(相当一个表中有很多的数据),基本上是一个全盘扫描的过程,这时如果你告诉搜索,你的文件就在D盘的TEST目录下,这样来搜索速度将会大大的提高,给文件定位就相当一个索引。
}4B2b/|s1a _oy0 好了,知道索引是干什么之后,下面来看看怎么走正确的索引,才能达到最高效。假如A表中有两个索引IDX_R1 INDEX(R1,R2,R4,R5),IDX_R3 INDEX(R1,R3,R4,R5) 现在需要做这样的操作,显示表中的条件值是R1 = 1,R3 = 3,R4 =4的所有内容。通常我们会写出下面的查询语句。
.l:v;F@hzp0 select * from A where R1 =1 and R3 =3 and R4;
s k!h+?I"I6?B+Z0按道理它走的索引是IDX_R3,有时候默认走的索引并不是你想象中的那样,特别是多表关联的情况下。所以我们进行指定一下索引,按我们真正想要的走的索引:Linux宝库:|;j%E1d,{%{$y
select /*+ index(R1,IDX_R3) */* from A where R1 =1 and R3 =3 and R4;Linux宝库~'~:a gq%C#K.r5v
Linux宝库9r$SO$G}`j)a二、在检索数据的时候两个表的关联查询效率低于使用EXISTS子句。
)cS P1T1i5d.t;KBr0 SELECT B.R1,B.B1,B.B2 FROM A,B WHERE A.R1 = B.R1;
-F-gf_1IHD0 优化为:
z}(Y| M0 SELECT B.R1,B.B1,B.B2 FROM B WHERE EXISTS(SELECT 1 FROM A WHERE A.R1 = B.R1);Linux宝库)]wd5G-pQls8M
如果你在WINDOWS的ORACLE的平台可以使用PL/SQL中的执行计划(EXPLAIN PLAN),看一下相应的执行时间进行验证。
C2@&d