oracle+SQL优化实例

1.     减少I/O操作:

SELECT COUNT(CASE WHEN empno>20 THEN 1 END) c1,COUNT(CASE WHEN empno<20 THEN 1 END) c2
FROM emp;
2. 通过rowid访问

SELECT ROWID,emp.* FROM emp
WHERE ROWID=chartorowid('AAAHW7AABAAAMUiAAA')

3.     使用索引唯一扫描

SELECT empno,ename FROM emp
WHERE empno='2000'

4.     使用并连接符号会使oracle忽略使用索用,即使是唯一索引

SELECT empno,ename FROM emp
WHERE empno||ename='2000naem'

改成这样就可使用索引了

SELECT * FROM emp
WHERE empno=2000 AND ename='dd'

5.     索引范围扫描

SELECT * FROM emp
WHERE empno<7000

6where条件子句的解析顺序是从下到上的

SELECT a.empno,b.dname FROM emp a,dept b
WHERE a.ename<'CLERK'
AND a.deptno=b.deptno;

耗时1.016秒
 
SELECT a.empno,b.dname FROM emp a,dept b
WHERE  a.deptno=b.deptno
AND a.ename<'CLERK';

耗时0.813

7.     使用通配符会使oracle不去使用索引

SELECT ename FROM emp
WHERE ename LIKE '%C%'

应改成

SELECT ename FROM emp
WHERE ename LIKE 'C%'

 

8.     使用唯一索引查找精确值是最快的,而索引范围扫描比较适合查找>=,<=的数据

SELECT a.itemid
FROM   pt_sche_detail a,
       pt_post_role   b
WHERE  a.itemid = b.taskid
AND    a.docid = 2281
AND    a.itemid != 1169015
AND    a.status != 0
AND    b.posttype = 1
AND    b.roleid = 1022
AND    b.roletype = 1

上面的语句改成:

SELECT a.itemid
FROM   pt_sche_detail a,
       pt_post_role   b
WHERE  a.itemid = b.taskid
AND    a.docid = 2281
AND    a.itemid != 1169015
AND    a.status != 0
AND    b.taskid IN
       (SELECT itemid
         FROM   pt_sche_detail temp
         WHERE  temp.docid = 2281
         AND    rownum <= (SELECT COUNT(itemid) FROM pt_sche_detail temp WHERE temp.docid = 2281))
AND    b.roleid = 1022
AND    b.roletype = 1
AND    b.posttype = 1

 

posted @ 2016-09-16 13:18  芜明-追星  阅读(314)  评论(0编辑  收藏  举报