標籤:
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,deptb
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
oracle+SQL最佳化執行個體