閱讀717 返回首頁    go 微軟 go windows


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 REGIONAVG(LOG_SIZE)FROM LOCATION
    GROUP HAVING REGION REGION != ‘SYDNEY'
    AND REGION != ‘PERTH'

    高效 

    SELECT REGIONAVG(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)

   SELECTFROM 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

  上一篇:go C#的引用參數和值參數
  下一篇:go 如何查看Oracle的版本信息