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

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

2022-06-13   來源: SQL語言 

  引言

  數據倉庫建設中的ETL(Extract Transform Load)是數據抽取轉換和裝載到模型的過程整個過程基本是通過控制用SQL語句編寫的存儲過程和函數的方式來實現對數據的直接操作SQL語句的效率將直接影響到數據倉庫後台的性能

  目前國內的大中型企業基本都具有四年以上計算機信息系統應用經驗積累了大量可分析的業務數據這些信息系統中的數據需要通過搭建數據倉庫平台才能得到科學的分析這也是近幾年數據倉庫系統建設成為IT領域熱門話題的原因

  優化的思路分析

  數據倉庫ETL過程的主要特點是面對海量的數據進行抽取分時段對大批量數據進行刪除更新和插入操作面對異常的數據進行規則化的清洗大量的分析模型重算工作有特定的過程處理時間規律性一般整個ETL過程需要在每天的零點開始到點之前完成所以針對ETL過程的優化主要是結合數據倉庫自身的特點抓住需要優化的主要方面針對不同的情況從如何采用高效的SQL入手來進行

  優化的實例分析

  目前數據倉庫建設中的後台數據庫大部分采用Oracle以下的SQL采用Oracle的語法來說明所有的測試在Oraclei環境中通過但其優化的方法和原理同樣適合除Oracle之外的其他數據庫

  索引的正確使用

  在海量數據表中基本每個表都有一個或多個的索引來保證高效的查詢在ETL過程中的索引需要遵循以下使用原則

  () 當插入的數據為數據表中的記錄數量%以上時 首先需要刪除該表的索引來提高數據的插入效率當數據全部插入後再建立索引

  () 避免在索引列上使用函數或計算在WHERE子句中如果索引列是函數的一部分優化器將不使用索引而使用全表掃描舉例:

  低效 SELECT * ROM DEPT WHERE SAL * > ;

  高效 SELECT * FROM DEPT WHERE SAL > /;

  () 避免在索引列上使用NOT和!= 索引只能告訴什麼存在於表中而不能告訴什麼不存在於表中當數據庫遇到NOT和!=就會停止使用索引轉而執行全表掃描

  () 索引列上用>=替代>

  高效 SELECT * FROM EMP WHERE DEPTNO >=

  低效 SELECT * FROM EMP WHERE DEPTNO >

  兩者的區別在於前者DBMS將直接跳到第一個DEPT等於的記錄而後者將首先定位到DEPTNO=的記錄並且向前掃描到第一個DEPT大於的記錄

  () 函數的列啟用索引方法如果一定要對使用函數的列啟用索引Oraclei以上版本新的功能基於函數的索引(FunctionBased Index)是一個較好的方案但該類型索引的缺點是只能針對某個函數來建立和使用該函數

  CREATE INDEX EMP_I ON EMP (UPPER( ENAME));
  SELECT * FROM EMP WHERE UPPER(ENAME) = BLACKSNAIL;

   游標的正確使用

  當在海量數據表中進行數據的刪除更新和插入操作時用游標處理的效率是最慢的方式但它在ETL過程中的使用又必不可少而且使用有著及其重要的地位所以游標的正確使用尤為重要

  對數據倉庫維表的數據進行維護時因為需要保證維表ID的一致性所以采用游標的是數據維護完整性的最好方式由於它的效率低如果按照普通的方式將無法處理大數據量的維表數據維護(一般是指萬條記錄以上的維表)以下是處理這種情況的有效方式

  () 在數據抽取的源表中使用時間戳這樣每天的維表數據維護只針對更新日期為最新時間的數據來進行大大減少需要維護的數據記錄數

  () 在INSERT和UPDATE維表時都加上一個條件來過濾維表中已經存在的記錄實例為

  INSERT INTO DIM_CUSTOMER SELECT * FROM ODS_CUSTOMER WHERE ODS_CUSTOMERCODE NOT EXISTS (DIM_CUSTOMERCODE)

  () 使用顯式的游標(CURSORs) 因為使用隱式的游標將會執行兩次操作第一次檢索記錄第二次檢查TOO MANY ROWS 這個EXCEPTION而顯式游標不執行第二次操作

[]  []  


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