Oracle Sql 语句性能调优
这篇文章是玄机逸士为某上市公司的ERP系统调优所撰写报告的部分摘录,希望能够对大家有所帮助:
下面给出SQL优化经常遇到的情形。它们是在很多人长期积累的经验上总结出来的,这些都是一些一般性的结论,在实际工作中,还应当具体情况具体分析,并加以灵活运用。
(1) 用NOT EXISTS替换NOT IN 将更显著地提高效率,尽量用NOT EXISTS替代NOT IN。在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS。
例如,
SELECT ENMAE
from EMP
WHERE DEPTNO NOT IN
(
SELECT DEPTNO
from DEPT
WHERE LOC='BOSTON'
);
为了提高效率,可改写为,
(方法一:高效)
SELECT ENAME
from EMP A,DEPT B
WHERE A.DEPTNO = B.DEPTNO(+)
AND B.DEPTNO IS NULL
AND B.LOC(+) = 'BOSTON'
(方法二:最高效)
SELECT ENAME
from EMP E
WHERE NOT EXISTS
( SELECT 'X' from DEPT D WHERE
D.DEPTNO = E.DEPTNO AND LOC='BOSTON'
);
除此之外,推荐使用NOT EXISTS的一个重要的原因是NOT EXISTS在当子查询可能返回NULL的情况下,更加可靠,这是因为在比较列表中如果包含NULL,NOT IN条件将为false。考虑下面的语句,该语句试图在EMP表中查询出来没有一个下属的人员列表:
SELECT ENAME, JOB from EMP
WHERE EMPNO NOT IN (SELECT MGR from EMP);
上面查询不会返回任何结果,因为某些记录的MGR字段是NULL值。正确的写法是:
SELECT ENAME, JOB from EMP E
WHERE NOT EXISTS (SELECT MGR from EMP WHERE MGR=E.EMPNO);
(2) 尽量避免在索引列上进行计算。
WHERE子句中,如果索引列是函数的一部分。优化器将不使用索引而使用全表扫描。例如:
低效的写法:
SELECT …
from DEPT
WHERE SAL * 12 > 25000;
高效的写法:
SELECT …
from DEPT
WHERE SAL > 25000/12;
这是一个非常实用的规则,请务必牢记。
(3) 用>=替代>
如果DEPTNO上有一个索引,
高效的写法:
SELECT *
from EMP
WHERE DEPTNO >=4
低效的写法:
相关文档:
命令行维护Oracle AWR
有时候由于种种原因,只能使用命令行来维护Oracle10g。当然我们依然可以使用statspack,但由于statspack功能不如AWR,而
且如果使用两种性能诊断工具也是一种浪费。因此手动维护AWR还是有必要的,下面列出一些常用的AWR命令,以备后查。
1、修改AWR的触发频率
......
一,Oracle数据库用户简介
在Oracle数据库中任何对象都属于一个特定用户,或者说一个用户与同名的模式相关联。
要连接到Oracle数据库需要一个用户帐户,根据需要授予的操作权限。
1,默认数据库用户模式:
Sys:数据库字典(存储被管理对象所有信息)和视图存储在该模式中。系统级用户。 ......
Tablespace
ORACLE中,表空间是数据管理的基本方法,所有用户的对象要存放在表空间中,也就是用户有空间的使用权,才能创建用户对象.否则是不充许创建对象,因为就是想创建对象,如表,索引等,也没有地方存放,Oracle会提示:没有存储配额.
因此,在创建对象之前,首先要分配存储空间.
分配存 ......
1)建立操作系统目录e:\test,准备数据文件dept.txt并置于e:\test之下
"10","ACCOUNTING","NEW
YORK"
"20","RESEARCH","DALLAS"
"30","SALES","CHICAGO"
"40","OPERATIONS","BOSTON"
2)创 ......