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
6.? where條件子句的解析順序是從下到上的
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
?
轉載于:https://www.cnblogs.com/huangf714/p/5876316.html
總結
以上是生活随笔為你收集整理的oracle+SQL优化实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【设计模式之单例模式InJava】
- 下一篇: c++ 四种类型转换机制