2013-02-18 76 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