熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL語言 >> 正文

ETL的過程原理和數據倉庫建設[2]

2013-11-13 12:35:58  來源: SQL語言 

  數據抽取和上載時的SQL優化

   WHERE子句中的連接順序

  ORACLE采用自下而上的順序解析WHERE子句根據這個原理表之間的連接必須寫在其它WHERE條件之前那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾

  低效SELECT * FROM EMP E WHERE SAL > AND JOB = MANAGER AND < (SELECT COUNT(*) FROM EMP WHERE MGR=EEMPNO);

  高效SELECT * FROM EMP E WHERE < (SELECT COUNT(*) FROM EMP WHERE MGR=EEMPNO) AND SAL > AND JOB = MANAGER;

   刪除全表時用TRUNCATE替代DELETE

  當DELETE刪除表中的記錄時有回滾段(rollback segments ) 用來存放可以被恢復的信息而當運用TRUNCATE時回滾段不再存放任何可被恢復的信息所以執行時間也會很短同時需要注意TRUNCATE只在刪除全表時適用因為TRUNCATE是DDL而不是DML

   盡量多使用COMMIT

  ETL中同一個過程的數據操作步驟很多數據倉庫采用的是數據抽取後分析模型重算的原理所以對數據的COMMIT不像業務系統為保證數據的完整和一致性而需要某個操作過程全部完成才能進行只要有可能就在程序中對每個DELETEINSERT和UPDATE操作盡量多使用COMMIT 這樣系統性能會因為COMMIT所釋放的資源而大大提高

   用EXISTS替代IN

  在許多基於基礎表的查詢中為了滿足一個條件往往需要對另一個表進行聯接例如在ETL過程寫數據到模型時經常需要關聯個左右的維表在這種情況下使用EXISTS而不用IN將提高查詢的效率

   用NOT EXISTS替代NOT IN

  子查詢中NOT IN子句將執行一個內部的排序和合並無論在哪種情況下NOT IN都是最低效的因為它對子查詢中的表執行了一個全表遍歷用NOT EXISTS替代NOT IN將提高查詢的效率

   優化GROUP BY

  提高GROUP BY 語句的效率可以通過將不需要的記錄在GROUP BY 之前過濾掉

  低效 SELECT JOB AVG(SAL) FROM EMP GROUP BY JOB HAVING JOB = PRESIDENT OR JOB = MANAGER

  高效 SELECT JOB AVG(SAL) FROM EMP WHERE JOB = PRESIDENT OR JOB = MANAGER GROUP BY JOB

   有條件的使用UNIONALL 替換UNION

  ETL過程針對多表連接操作的情況很多有條件的使用UNIONALL 替換UNION的前提是所連接的各個表中無主關鍵字相同的記錄因為UNION ALL 將重復輸出兩個結果集合中相同記錄

  當SQL語句需要UNION兩個查詢結果集合時這兩個結果集合會以UNIONALL的方式被合並然後在輸出最終結果前進行排序如果用UNION ALL替代UNION這樣排序就不是必要了效率就會因此得到提高

   分離表和索引

  總是將你的表和索引建立在不同的表空間內決不要將不屬於ORACLE內部系統的對象存放到SYSTEM表空間裡同時確保數據表空間和索引表空間置與不同的硬盤控制卡控制的硬盤上

[]  []  


From:http://tw.wingwit.com/Article/program/SQL/201311/16217.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.