1索引的正確使用
在海量資料表中,基本每個表都有一個或多個的索引來保證高效的查詢,在ETL過程中的索引需要遵循以下使用原則:
(1) 當插入的資料為資料表中的記錄數量10%以上時, 首先需要刪除該表的索引來提高資料的插入效率,當資料全部插入後再建立索引。
(2) 避免在索引列上使用函數或計算,在WHERE子句中,如果索引列是函數的一部分,最佳化器將不使用索引而使用全表掃描。舉例:
低效: SELECT * ROM DEPT WHERE SAL * 12 > 25000;
高效: SELECT * FROM DEPT WHERE SAL > 25000/12;
(3) 避免在索引列上使用NOT和”!=” , 索引只能告訴什麼存在於表中,而不能告訴什麼不存在於表中,當資料庫遇到NOT和”!=”時,就會停止使用索引轉而執行全表掃描。
(4) 索引列上用>=替代>
高效: SELECT * FROM EMP WHERE DEPTNO >=4
低效: SELECT * FROM EMP WHERE DEPTNO >3
兩者的區別在於,前者DBMS將直接跳到第一個DEPT等於4的記錄而後者將首先定位到DEPTNO=3的記錄並且向前掃描到第一個DEPT大於3的記錄。
(5) 函數的列啟用索引方法,如果一定要對使用函數的列啟用索引,Oracle9i以上版本新的功能:基於函數的索引(Function-Based Index)是一個較好的方案,但該類型索引的缺點是只能針對某個函數來建立和使用該函數。
CREATE INDEX EMP_I ON EMP (UPPER( ENAME));
SELECT * FROM EMP WHERE UPPER(ENAME) = ‘BLACKSNAIL’;
2 遊標的正確使用
當在海量資料表中進行資料的刪除、更新和插入操作時,用遊標處理的效率是最慢的方式,但它在ETL過程中的使用又必不可少,而且使用有著及其重要的地位,所以遊標的正確使用尤為重要。
對資料倉儲維表的資料進行維護時,因為需要保證維表ID的一致性,所以採用遊標的是資料維護完整性的最好方式。由於它的效率低,如果按照普通的方式將無法處理大資料量的維表資料維護(一般是指10萬條記錄以上的維表),以下是處理這種情況的有效方式:
(1) 在資料幫浦的源表中使用時間戳,這樣每天的維表資料維護只針對更新日期為最新時間的資料來進行,大大減少需要維護的資料記錄數。
(2) 在INSERT和UPDATE維表時都加上一個條件來過濾維表中已經存在的記錄,執行個體為:
INSERT INTO DIM_CUSTOMER SELECT * FROM ODS_CUSTOMER WHERE ODS_CUSTOMER.CODE NOT EXISTS (DIM_CUSTOMER.CODE)
(3) 使用顯式的遊標(CURSORs) ,因為使用隱式的遊標將會執行兩次操作,第一次檢索記錄,第二次檢查TOO MANY ROWS 這個EXCEPTION,而顯式遊標不執行第二次操作。