暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
ORACLE_SQL语句优化.doc
353
6页
0次
2021-02-22
40墨值下载
这两天闲着没事情,项目也快上线了,就把以前在项目里写的
SQL
语句都看了一遍。
参照往年优化
SQL
的经验和网上对
SQL
语句优化的方法总结,加上
oracle
这么强大的
SQL
分析工具,把写的不是很优的
SQL
拿来优化了。
总结如下:
一、固定的
SQL
书写习惯,相同的查询尽量保持相同
二、存储过程的效率较高。
三、编写与其格式一致的语句,包括字母的大小写、标点符号、换行的位置等都要一致
    
sql
语句用大写的;因为
oracle
总是先解析
sql
语句,把小写的字母转换成大写
的再执行
.
四、写查询语句的时候,尽量不要出现
' * '
,把需要的列查询出来就可以。
1.
尽量少用
IN
操作符,基本上所有的
IN
操作符都可以用
EXISTS
代替、
not in
not
EXISTS
代替
.
特别注意:
IN
适合于外表大而内表小的情况;
EXISTS
适合于外表小而内表大的情况。
不是说所有的
in
或者
not in
都可以用
EXISTS
not EXISTS
代替
.
IN
来替换
OR
这是一条简单易记的规则,但是实际的执行效果还须检验,在
ORACLE8i
下,两者的执行
路径似乎是相同的. 
低效
:
SELECT…. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID =
30
高效
SELECT… FROM LOCATION WHERE LOC_IN IN (10,20,30);
UNION
替换
OR (
适用于索引列
)
通常情况下
,
UNION
替换
WHERE
子句中的
OR
将会起到较好的效果
.
对索引列使用
OR
将造成全表扫描
.
注意
,
以上规则只针对多个索引列有效
.
如果有
column
没有被索引
,
查询效率可能会因为你
没有选择
OR
而降低
.
在下面的例子中
, 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,
那就需要返回记录最少的索引列写在最前面
.
2.
不用“
<>”
或者“
!=”
操作符。对不等于操作符的处理会造成全表扫描,可以用“
<” or “>”
例如:
a<>0
改为
a>0 or a<0
a<>’’
改为
a>’’
3.Where
子句中出现
IS NULL
或者
IS NOT NULL
时,
Oracle
会停止使用索引而执行全表
扫描。
可以考虑在设计表时,对索引列设置为
NOT NULL
。这样就可以用其他操作来取代判断
NULL
的操作
用其它相同功能的操作运算代替,如:
1
a is not null
改为
a>0
a>’’
等。
2
、不允许字段为空,而用一个缺省值代替空值,如业扩申请中状态字段不允许为空,
缺省为申请。
3
建立位图索引(有分区的表不能建,位图索引比较难控制,如字段值太多索引会使
性能下降,多人更新操作会增加数据块的现象)
如果列存在空值,使对列建索引也不会高性能。任何
WHERE
子句中使用
is
null
is not null
的语句优化是不允许使用索引的。
4
符“
%”
或者“
_”
作为查询字符一个字符时,索引不会被使用
.
例如:
select u.name from user u where u.name like '%huang%'
应该改为:
select u.name from user u where u.name like 'huang%'
5
、对于有连接的列“
||”
,最一个连接列索引会效。尽量避免连接,可以分开连接或者
使用不作用在列上的数替代。
6
、如果索引不是基于数的,那么
Where
子句中对索引列使用数时,索引不再起
作用。
例如:
creadate
有索引
查询:
select a.paicUmNum from ps_NumBer a where to_char(a.creadate,'yyyy-MM-
dd')>'2010-10-12'
不使用索引
select a.paicUmNum from ps_NumBer a where a.creadate>to_date('2010-10-12','yyyy-
MM-dd')
使用索引
of 6
40墨值下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜