Oracle中SQL的性能優化
【IT168技術文檔】1、用EXISTS替代IN,NOT EXISTS替代NOT IN: 在子查詢中,NOT在許多基於基礎表的查詢中,為了滿足一個條件,往往需要對另一個表進行聯接.在這種情況下,使用EXISTS(或NOTEXISTS)通常將提高查詢的效率.
SELECT AND EXISTS (SELECT ‘X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO
AND LOC = ‘MELB')
2、用Where子句替換HAVING子句:
避免使用HAVING子句, HAVING隻會在檢索出所有記錄之後才對結果集進行過濾.
這個處理需要排序,總計等操作.如果能通過WHERE子句限製記錄的數目,那就能減少這方麵的開銷.
例如:
低效:
SELECT REGION,AVG(LOG_SIZE)FROM LOCATION
GROUP HAVING REGION REGION != ‘SYDNEY'
AND REGION != ‘PERTH'
高效
SELECT REGION,AVG(LOG_SIZE) FROM LOCATION
WHERE REGION REGION != ‘SYDNEYBY REGION
3、使用表的別名(Alias)
當在SQL語句中連接多個表時,請使用表的別名並把別名前綴於每個Column上.這樣一來,就可以減少解析的時間並減少那些由Column歧義引起的語法錯誤.
4、用EXISTS替換DISTINCT
當提交一個包含一對多表信息(比如部門表和雇員表)的查詢時,避免在SELECT子句中使用DISTINCT.一般可以考慮用EXIST替換
例如:
低效:
SELECT FROM DEPT D,EMP E
WHERE D.DEPT_NO = E.DEPT_NO
高效:
SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE 10 UNION
低效:
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION WHERE LOC_ID = 10
OR LOC_ID = 30
高效
SELECT…
FROM LOCATION WHERE LOC_IN IN (AND JOB = ‘MANAGER'
AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO);
(高效,執行時間10.6秒)
SELECT … FROM EMP E WHERE 25 *) FROM EMP
WHERE MGR=E.EMPNO) AND JOB = ‘MANAGER';
8、計算記錄條數 和一般的觀點相反, count(*) 比count(1)稍快 , 當然如果可以通過索引檢索,對索引列的計數仍舊是最快的. 例如 COUNT(EMPNO)
最後更新:2017-04-03 12:54:13
上一篇:
C#的引用參數和值參數
下一篇:
如何查看Oracle的版本信息
應對安全漏洞:如何將LFI變為RFI
Linux字符設備驅動
阿裏雲主機會話協同分享
Ubuntu 12.10擊敗Windows 8的十個理由
服務器上使用 git 更新 wordpress 內核方案
雲棲大會WiFi兩天掛兩次的秘密
8月11日雲棲精選夜讀:阿裏雲與神州雲計算定製混合雲解決方案助企業轉型
Java連接sqlserver2005到主機的TCP/IP連接失敗問題
java.util.ConcurrentModificationException異常 解決方法
Tomcat啟動報錯:java.lang.IllegalArgumentException: Can't convert argument:null