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レコードをロードしています。ファクト テーブルに読み込むレコードが不足しています。誰かが私に最適化を提案できますか?

要件は、他のテーブルをループし、ディメンション テーブルから必要なキー値を収集して、ファクト テーブルを読み込むことです。

4

1 に答える 1

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 は、不明なデータの各次元のダミー行の ID です

次に、ファクト テーブルにインポートするデータにリンクされたディメンションの ID を持つテーブルが作成されます。ファクト テーブルのエントリがまだ存在しない場合は、ファクト キーとして 0 を使用し、ファクト テーブル エントリの ID を使用します。それ以外は。

次に、tmp_fact_table.fact_key != 0 のファクト テーブルを更新します。

次に、tmp_fact_table.fact_key = 0 のファクト テーブルに挿入します。

それでおしまい。

何百万もの行でこれを行っていますが、約30分かかります。300,000 行はピーナッツです。

于 2013-02-18T12:04:25.290 に答える