データベースを構築中で、現在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;
速くなり、これを達成する方法はありますし、メモリを少なくしますか?私は多くの手続きを書いていないので、私のコードが醜いかどうかを私に知らせてください。
ありがとうございました。
エラーメッセージフィールドにインデックスがありますか? –
はい、フィールドのインデックスを作成しました。それはちょっと助けましたが、インデックスのサイズのためにDetailsテーブルへの新しい挿入が遅く実行されるので、私はそれが最終的に削除されることを望んでいます。 – Jack