想要优化Oracle的性能 就要从以下四个方面做起
- 不要让Oracle做的太多
- 给优化器更明确的命令
- 减少访问次数
- 细节上的影响
目录
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子句中,如果索引列所对应的值的第一个字符由通配符开始,