1、删除重复记录
最高效的删除重复记录方法 ( 因为使用了ROWID)
DELETE FROM EMP E
WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMPNO = E.EMPNO);
2、用TRUNCATE(删除全表适用)替代DELETE
3、尽量多使用COMMIT
4、计算记录条数COUNT(索引)
5、使用EXISTS(或NOT EXISTS)替代IN
低效
SELECT *
FROM EMP --(基础表)
WHERE EMPNO > 0
AND DEPTNO IN (SELECT DEPTNO
FROM DEPT) and rownum<100
/
高效
SELECT *
FROM EMP --(基础表)
WHERE EMPNO > 0
AND EXISTS (SELECT 'X'
FROM DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
) and rownum<100
/
5、用EXISTS替换DISTINCT
低效:
select distinct d.deptno,d.dname
from dept d,emp e
where d.deptno = e.deptno
高效:
select deptno,dname
from dept d
where exists(
select 'x' from emp e where e.deptno = d.deptno
)
EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果。
6、避免在索引列上使用计算。
WHERE子句中,如果索引列是函数的一部分。优化器将不使用索引而使用全表扫描。
低效:
select * from emp where sal*12 >25000
高效:
select * from emp where sal >25000/12
7、用>=替代>
如果DEPTNO上有一个索引,
低效:
select * from emp where empno>123 and rownum<1000
高效:
select * from emp where empno>=124 and rownum<1000
两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录。
8、用UNION替换OR (适用于索引列)
低效:
select sal,job from emp
where sal = 800 or job = 'CLERK'
高效:
select sal,job from emp
where sal = 800
union
select sal,job from emp
where job = 'CLERK'
最高效的删除重复记录方法 ( 因为使用了ROWID)
DELETE FROM EMP E
WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMPNO = E.EMPNO);
2、用TRUNCATE(删除全表适用)替代DELETE
3、尽量多使用COMMIT
4、计算记录条数COUNT(索引)
5、使用EXISTS(或NOT EXISTS)替代IN
低效
SELECT *
FROM EMP --(基础表)
WHERE EMPNO > 0
AND DEPTNO IN (SELECT DEPTNO
FROM DEPT) and rownum<100
/
高效
SELECT *
FROM EMP --(基础表)
WHERE EMPNO > 0
AND EXISTS (SELECT 'X'
FROM DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
) and rownum<100
/
5、用EXISTS替换DISTINCT
低效:
select distinct d.deptno,d.dname
from dept d,emp e
where d.deptno = e.deptno
高效:
select deptno,dname
from dept d
where exists(
select 'x' from emp e where e.deptno = d.deptno
)
EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果。
6、避免在索引列上使用计算。
WHERE子句中,如果索引列是函数的一部分。优化器将不使用索引而使用全表扫描。
低效:
select * from emp where sal*12 >25000
高效:
select * from emp where sal >25000/12
7、用>=替代>
如果DEPTNO上有一个索引,
低效:
select * from emp where empno>123 and rownum<1000
高效:
select * from emp where empno>=124 and rownum<1000
两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录。
8、用UNION替换OR (适用于索引列)
低效:
select sal,job from emp
where sal = 800 or job = 'CLERK'
高效:
select sal,job from emp
where sal = 800
union
select sal,job from emp
where job = 'CLERK'