Oracle SQL 调优优化

  1. 1、尽量少用IN操作符

基本上所有的IN操作符都可以用EXISTS代替,在选择INEXIST操作时,要根据主子表数
据量大小来具体考虑。

  1. 2、尽量用NOT EXISTS或者外连接替代NOT IN操作符

因为NOT IN不能应用表的索引

  1. 3、尽量不用“<>“或者“!=“,IS NULL和 IS NOT NULL操作符

不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。比如:a<>0改为

a>0 or a<0

低效(索引失效)
SELECT ... FROM TABLE WHERE T_CODE IS NOT NULL;
高效(索引有效)
SELECT ... FROM TABLE WHERE T_CODE >=0;

  1. 4、在设计表时,把索引列设置为NOT NULL

判断字段是否为空一般是不会应用索引的,因为B树索引是不索引空值的。

  1. 5、尽量不用通配符“%”或者”_“作为查询字符串的第一个字符

当通配符“%”或者“_”作为直询字符串的第一个字符时,索引不会被使用。比如用T表中Columnl LIKE  "%5400%" 这个条件会产生全表扫描:如果改成CohmmnI  "X5400%" 0R Columnl LIKE “B5400%“,则会利用Columnl 的索引进行两个范围的查询,性能肯定大大提高

  1. 6、Where子句中避免在索引列上使用计算

如果索引不是基于函数的,那么当在Where子句中对索引列使用函数时,索引不再起作
用。因此Where子句中避免在索引列上使用计算。

  1. 7、用“>=”替代“>”

大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找,但有的情
况下可以对它进行优化,如一个表有100万记录,一个数值型字段A

  1. 8、WHERE后面的条件顺序要求

WHERE后面的条件,表连接语句写在最前,可以过滤掉最大数量记录的条件居后

  1. 9、使用表的别名,并将之作为每列的前缀

在Sql语句中连接多个表时,使用表的别名,并将这作为每列的前缀。这样可以减少解析
时间。

  1. 10、用UNION ALL代替UNION

UNION是最常用的集操作,使多个记录集联结成为单个集,对返回的数据行有唯一性要求,所以、oracle就需要进行SORT UNIQUE操作(与使用distinct时操作类似),如果结果集又比较大,则操作会比较慢; UNION ALL操作不排除重复记录行,所以会快很多,如果数据本身重复行存在可能性较小时,用union all会比用union效率高很多!

  1.  11、用UNION、IN替换 OR(适用于索引列)

通常情况下,用 UNION 替换 WIIERE 子句中的OR 将会起到较好的效果,对索引列使用 OR将造成全表扫描,注意,以上规则只针对多个索引列有效,如果
有column 没有被索引,查询效率可能会因为你没有选择 OR 而降低,在下面的例子
中,L0C_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,那就需要返回记录最少的索引列写在最前面。

  1. 12、用EXISTS 替换 DISTINCT :

当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避兔
在SELECT子句中使用 DISTINCT,一般可以考虑用 EXISTS替换,EXISTS 使查询更为迅速,因为RDBMS 核心模块将在 子查询的条件一旦满足后,立刻返回结果。

例子:

(低效)↓
SELECT DISTINCT DEPT_NO,DEPT_NAME
FROM DEPT D, EMP E
WHERE D.DEPT_NO =E.DEPT_NO

(高效)↓
SELECT DEPL_NO,DEPT_NAME FROM DEPT D WHERE EXISTS
(SELECT'X' FROM EMP E
 WHERE E.DEPT_NO =D.DEPT_NO)


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是羅 不是椤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值