Oracle性能优化之四个方面

想要优化Oracle的性能 就要从以下四个方面做起

  1. 不要让Oracle做的太多
  2. 给优化器更明确的命令
  3. 减少访问次数
  4. 细节上的影响

目录

1. 不要让Oracle做的太多

避免复杂的多表关联

避免使用 星号 “*”

避免使用耗费资源的操作

2. 给优化器更加明确的命令

自动选择索引

至少要包含组合索引的第一列

避免在索引列上使用函数

避免使用前置通配符

避免在索引列上使用NOT

避免在索引列上使用IS NULL 和IS NOT NULL 

避免出现索引列自动转换

在查询时尽量少用格式转换

3. 减少访问次数

减少访问数据库的次数

使用DECODE来减少处理时间

减少对表的查询

4. 细节上的影响

where子句中的连接顺序

WHERE子句中的函数和表达式的使用

ORDER BY语句

联接列

用WHERE子句替换HAVING子句

用 NOT EXSITS替代NOT IN

通过使用>=、<=等,来避免使用NOT命令

尽量多使用COMMIT


1. 不要让Oracle做的太多

避免复杂的多表关联

复杂的多表关联很难优化,而且随着数据量的增加,性能风险也在增加。

避免使用 星号 “*”

使用 星号*是一个非常方便但是又很低效的方法。事实上,Oracle在解析的过程中会将星号*一次转换成多有列名,这个工作是通过查询数据字典完成的,这意味着耗费更多的时间。

因此,最好的办法就是只提取要使用的列,而且使用列别名能够加快解析速度

避免使用耗费资源的操作

带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的sql语句会启动sql引擎执行耗费资源的排序功能。DISTINCT需要一次排序操作,但是其他的至少需要执行两次。

例如,一个UNION查血,其中每个查询都带有GROUP BY的子句,GROUP BY 会触发嵌入排序(NESTED SORT)。因此每个查询需要执行一次排序,然后在执行UNION时,另一种排序——唯一排序(SORT UNIQUE)操作也需要被执行,但是它只能等待前面的嵌入排序结束后才能开始执行。因此嵌入排序的深度大大的影响查询效率。

通常,带有DISTINCT,UNION,MINUS,INTERSECT的SQL语句都可以用其他方式重写

比如,用EXISTS替换DISTINCT

--低效
SELECT DISTINCT dept_no,dept_name
FROM dept D, emp E
WHERE D.dept_no=E.dept_no

--高效
SELECT dept_no,dept_name
FROM dept D
WHERE EXISTS(
    SELECT 1
    FROM emp E
    WHERE E.dept_no=D.dept_no
)

用UNION ALL 替换 UNION:

当sql语句需要取两个查询结果集合的并集时,使用UNION ALL并对最后输出结果排序会更加高效。

2. 给优化器更加明确的命令

自动选择索引

如果表中有两个及以上的索引,其中有一个唯一性索引,而其他是普通索引时,Oracle将使用唯一索引检索记录而户数普通索引。

至少要包含组合索引的第一列

如果索引是建立在多个列上,只有在他的第一个列被where子句引用时,优化器才会选择使用该索引。当引用索引的第二列及以后时,优化器选择全表扫描而忽略了索引。

避免在索引列上使用函数

where子句中,如果索引列是函数的一部分,优化器将不使用索引而采用全表扫描。列:

--低效
SELECT ...
FROM dept
WHERE sal*12 > 25000;

--高效
SELECT ...
FROM dept
WHERE sal > 25000/12;

避免使用前置通配符

where子句中,如果索引列所对应的值的第一个字符由通配符开始,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值