2

52600 レコードのストアド プロシージャで作成された一時テーブルがあります。一時テーブルを反復処理し、各行の列を更新したいと考えていました。

ここではcursors、一時テーブル用に2つ、3行あるtable2などの他のテーブル用に2つあり、一時テーブルから1行を取得し、table2を反復して比較する必要があります。

このプロセスには約 500 秒の時間がかかりますが、stored procedureカーソルとループを使用して行うのが良いですか、それともコードで行うのが良いですか?

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_repaymentDelay`()
BEGIN
    drop table if exists loan_repayed_temp;
    create temporary table loan_repayed_temp ( l_id int primary key, loan_Id int, installmentNo int,date_Diff int,interval_id int default 0);

insert into loan_repayed_temp (l_id,loan_Id,installmentNo,date_Diff) 

     select  lrs.id ,lrs.loan_profile_id ,lrs.installment_number , datediff(curdate(), lrs.estimated_payment_date) from 
 loanTable lp inner join loanrepaymentschedule lrs on lp.id = lrs.loan_profile_id and lp.state = 'REPAYMENT_IN_PROGRESS'
 left join repayments r on lrs.loan_profile_id = r.loan_profile_id and r.repayment_number = lrs.installment_number 
 where r.loan_profile_id is null and lrs.estimated_payment_date < NOW()  

;

    BEGIN
        declare done int default false;

        declare lid, loanId, installmentNo , dateDiff int;
        declare cursor2 cursor for select id, interval_range_min, interval_range_max from delay_interval;
        declare cursor1 cursor for select l_id,loan_Id, installmentNo,date_Diff from loan_repayed_temp;

        declare continue handler for not found set done = true;

       open cursor1;

            cursor1_loop : loop

                fetch cursor1 into lid, loanId, installmentNo, dateDiff;

                IF done THEN
                LEAVE cursor1_loop;
                END IF;


          --    delay interval comparision --

                BEGIN
                    declare i , min ,max int;
                    declare done2 int default false;
                    declare continue handler for not found set done2 = true;

                    open cursor2;

                    cursor2_loop: loop

                            fetch cursor2 into i, min, max;

                            IF done2 THEN
                            LEAVE cursor2_loop;
                            end IF;



                                if dateDiff >= min and dateDiff <= max then



                            --    insert into datedemo values(dateDiff,loanId,i);


                                 update loan_repayed_temp set interval_id = i where l_id = lid; 

                                    leave cursor2_loop;

                                end if; 



                        end loop cursor2_loop; 

                    close cursor2;
                END; 

                -- --



                end loop cursor1_loop;



        close cursor1;

    END; 



    drop table  loan_repayed_temp;
END
4

1 に答える 1

0

カーソルを正しく理解している場合は、一時テーブル内のすべてのレコードをループして、date_diff フィールドが delay_interval テーブルの最小値と最大値の間にあるかどうかを確認します。もしそうなら、これは同じように機能し、はるかに高速になるはずです:

UPDATE loan_repayed_temp l
    INNER JOIN delay_interval d
        ON l.date_Diff >= d.interval_range_min
            AND l.date_Diff <= interval_range_max
SET l.interval_id = d.id

サンプルのSQL Fiddleを次に示します。私が誤解した場合はお知らせください。

幸運を。

于 2013-02-13T05:21:58.593 に答える