2017-08-01 10 views
1

データベースを構築中で、現在2つのテーブルをエラーメッセージフィールド(varchar(255)に設定)で結合する必要がある問題が発生しました。これは(明らかに)結合が実行されるときにパフォーマンスとロックの問題を引き起こします。私の最初の声明は、1000行以上の更新でぶら下がっていました。長いテキストフィールドへの結合

私は、UPDATEステートメントをより小さな部分に分割するためにストアドプロシージャに変更することに決めました。これは動作しますが、私は手続きのコードは次のようになります200のバッチでwhileループや更新を使用していますので、パフォーマンスの面で理想的ではありません。

CREATE PROCEDURE update_detail_table() 

BEGIN 

declare rowsToProcess int default 0; 

set rowsToProcess = 
    (select count(*) 
    from Integration_Report.Integration_Detail 
    where Error_Key is null); 

CREATE TABLE Integration_Report.temp_error_processing (
    Detail_Key bigint DEFAULT null, 
    Error_Key bigint DEFAULT null 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

while rowsToProcess > 0 DO 

    INSERT INTO Integration_Report.temp_error_processing 
     (SELECT D.Detail_Key, E.Error_Key 
      FROM Integration_Report.Integration_Detail D 
      JOIN Integration_Report.Integration_Error_Descriptor E 
      ON D.Error_Message = E.Error_Message 
      WHERE D.Error_Key is null 
      ORDER BY D.Insert_Datetime desc 
      LIMIT 200); 

    UPDATE Integration_Report.Integration_Detail D 
    JOIN Integration_Report.temp_error_processing T 
    ON D.Detail_Key = T.Detail_Key 
    SET D.Error_Key = T.Error_Key; 

    TRUNCATE TABLE Integration_Report.temp_error_processing; 

    set rowsToProcess = 
     (select count(*) 
     from Integration_Report.Integration_Detail 
     where Error_Key is null); 

end while; 

drop table Integration_Report.temp_error_processing; 

END; 

速くなり、これを達成する方法はありますし、メモリを少なくしますか?私は多くの手続きを書いていないので、私のコードが醜いかどうかを私に知らせてください。

ありがとうございました。

+0

エラーメッセージフィールドにインデックスがありますか? –

+0

はい、フィールドのインデックスを作成しました。それはちょっと助けましたが、インデックスのサイズのためにDetailsテーブルへの新しい挿入が遅く実行されるので、私はそれが最終的に削除されることを望んでいます。 – Jack

答えて

0

あなたが持っているチャンクの非効率性の一部は、それが終了した行を繰り返し踏み越えているということです。目標は、毎回異なる200行を見ることです。

は、私はここの詳細について説明します。それは、再スキャンを避けるためにPRIMARY KEYを使用してテーブルを歩くことhttp://mysql.rjweb.org/doc.php/deletebig#deleting_in_chunks

注意を。そして、必ずしも完全なチャンクサイズを処理する必要はありません。 COUNT(*)の必要はありません。テーブルの終わりに達すると終了するのに十分です。

+0

ありがとうございます。あなたが提供したドキュメンテーションが助けられ、パフォーマンスが大幅に向上しました。 – Jack

関連する問題