2013-02-18 30 views
0
DELIMITER $$ 

CREATE PROCEDURE Load_Fact_List() 

BEGIN 

    DECLARE Project_Number_Temp INT; 
    DECLARE Panel_Id_Temp INT; 
    DECLARE Employee_Id_Temp INT; 
    DECLARE Zip_Temp VARCHAR(255); 
    DECLARE Created_Date_Temp DATE; 
    DECLARE Country_Temp VARCHAR(255); 


    DECLARE no_more_rows BOOLEAN; 
    DECLARE loop_cntr INT DEFAULT 0; 
    DECLARE num_rows INT DEFAULT 0; 


    DECLARE load_cur CURSOR FOR 
SELECT Project_Id, Panel_Id, Employee_Id, Zip, Created_Date 
    FROM Fact_List; 



    DECLARE CONTINUE HANDLER FOR NOT FOUND 
    SET no_more_rows = TRUE; 


    OPEN load_cur; 
    select FOUND_ROWS() into num_rows; 

    the_loop: LOOP 

    FETCH load_cur 
    INTO Project_Number_Temp, Panel_Id_Temp, Employee_Id_Temp, Zip_Temp, Created_Date_Temp; 


    IF no_more_rows THEN 
     CLOSE load_cur; 
     LEAVE the_loop; 
    END IF; 

SET Country_Temp= (select Country from Zip where Zip= Zip_Temp); 

INSERT INTO Test_Fact 
( 
     Project_Key, 
     Campaign_Key, 
     Respondents_Key, 
     Event_Key, 
     Employee_Key, 
     Geography_Key, 
     Date_Key  
) 

SELECT (SELECT Project_Key from Project_Dim where Project_Id= Project_Number_Temp AND Quota_Country= Country_Temp),0,(SELECT MAX(Respondents_Key) from Respondents_Dim WHERE Panel_Id= Panel_Id_Temp),1,(select MAX(Employee_Key) from Employee_Dim WHERE Employee_Id= Employee_Id_Temp),(Select Geography_Key from Geography_Dim where Zip= Zip_Temp), (Select Date_Key from Date_Dim where Full_Date= Created_Date_Temp); 

    SET loop_cntr = loop_cntr + 1; 
    END LOOP the_loop; 


    select num_rows, loop_cntr; 


END $$ 

上面的代碼正常工作,但它是該死的緩慢。每1小時加載1000條記錄。我沒有記錄加載到事實表中。任何人都可以建議我任何優化?存儲過程需要執行一段時間?

要求是通過循環其他表並從維表中收集所需的鍵值來加載事實表。

+0

你不需要遊標。重寫整個事情。你的'FOUND_ROWS()'也有錯誤的值,因爲你沒有使用'SQL_CALC_FOUND_ROWS'。 – fancyPants 2013-02-18 11:00:35

+0

如果我不使用遊標,那麼我如何循環記錄? – user1597811 2013-02-18 11:04:00

+0

你不需要。只需'INSERT .... SELECT ...'並在必要時轉換您的數據到'SELECT' – fancyPants 2013-02-18 11:12:00

回答

1

通常的程序實際上是這樣的。

您已經構建了維並且只是將要插入到事實表中的數據收集到臨時表中。然後你在另一個臨時表像這樣插入此數據:

INSERT INTO tmp_fact_table 
(
fact_key, 
dim1_key, 
dim2_key, 
... 
fact1, 
fact2 
... 
) 
SELECT 
ISNULL (f.fact_key, 0), 
ISNULL (d1.sid, 0) as whatever, 
ISNULL (d2.sid, 0) as whatever2, 
... 
ISNULL (tt.fact1, 0), 
ISNULL (tt.fact2, 0) 
FROM 
yourTempTable tt 
LEFT JOIN Dim1 d1 ON tt.identifying_column = d1.identifying_column 
... 
LEFT JOIN fact_table f ON 
f.dim1_key = d1.sid 
AND f.dim2_key = d2.sid 

其中

  • fact_key在事實表的標識列
  • dim1_key是外鍵在事實表的尺寸
  • fact1等都是事實表中所需的事實,清除
  • 當找不到條目時,ISNULL()函數返回0。 0是你的虛擬行的每個維度的未知數據

然後,你將有,你必須要導入到你的事實表0您維度鏈接到數據的ID的表中的id爲事實在事實表中的條目尚不存在時輸入密鑰,否則輸入事實表條目的ID。

又在哪裏tmp_fact_table.fact_key!= 0

然後插入到事實表,其中tmp_fact_table.fact_key = 0

就是這樣你更新事實表。

我這樣做了數百萬行,大約需要半個小時。花生是30萬行。

+0

感謝您的努力。我會讓你知道結果。 – user1597811 2013-02-18 12:21:54