程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> oracle查詢優化

oracle查詢優化

編輯:Oracle教程

oracle查詢優化


1. 查詢條件合理排序

Oracle采用自下而上的順序解析WHERE字據,從優化性能角度考慮,建議將那些可以過濾掉大量記錄行的條件寫在WHERE子句的末尾,而將表

之間的連接條件置於其他WHERE子句之前,即對易排查的條件先做判斷處理,這樣在過濾掉盡可能多的記錄後再進行等值連接,可以提高檢索效率。

例如:

SELECT empno, ename, job, sal, dept.deptno, dname

FROM emp, dept

WHERE emp.deptno = dept.deptno AND emp.deptno = 20;

要比下述語句的查詢效率高一些:

SELETE empno, ename, job, sal, dept.deptno, dname

FROM emp, dept

WHERE emp.deptno = 20 AND emp.deptno = dept.deptno;

2.連接中使用表別名

在進行連接查詢時,建議在SQL語句中使用表的別名, 並把別名前綴與每個字段上。這樣可以減少解析的時間,並可避免因字段名存在歧義(使用多個

表中出現的同名字段)而導致的語法錯誤。例如下述語句:

SELECT e.empno, e.ename, e.job, e.sal, e.deptno, d.name

FROM emp e, dept d

WHERE e.deptno = d.deptno AND e.deptno = 20;

3.用EXISTS替換DISTINCT

在進行一對多關系的表間連接查詢時,如果要剔除結果中的重復行,可以考慮使用EXISTS(結合子查詢)替換DISTINCT。

例如:

SELECT deptno, dname FROM dept d WHERE EXIST (SELECT 'y' FROM emp e WHERE e.deptno = d.deptno);

4.用WHERE替換HAVING

由於SELECT語句的執行順序為:先WHERE子句, 在GROUP BY 子句, 然後SELECT查詢, 再後HAVINT子句,最後是ORDER BY子句,因此在進行分組

查詢時,如果過濾條件不涉及分組計算,則應該使用WHERE語句替換HAVING指定的過濾條件

例如:

SELECT deptno, avg(sal) FROM emp

WHERE deptno IN (10, 20)

GROUP BY deptno;

效率會高於下面

SELECT deptno, avg(sal) FROM emp

GROUP BY deptno

HAVING deptno IN (10, 20);

當然, 如果分組查詢的過濾條件設計分組計算,就只能在HAVING子句中指定了。

5.使用系統函數

系統函數畢竟是數據庫廠商提供的“專業”解決方案,相對更可靠一些

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved