shuichiの日記: トランザクションのcommitは思っているよりと遅い 3
日記 by
shuichi
とあるバッチ処理で、時間内に処理が終わらないという問題が発生した。
このバッチは、読み込んだデータを、少々加工しワークテーブルに挿入しており、
20,000件の場合で約5分かかる。
プログラムを確認したところ、1件挿入するたびにコミットする様になっていた。
このワークテーブルは他のプログラムからは使用されない。
全件挿入後にコミットするように変更したところ、1分弱で終わるようになった。
さて、コミットの処理は遅いとよく言われているが、どれほど遅いのだろうか?
データベースのACID特性で、Durability(永続性)というのがある。。
ACIDをサポートしたデータベースなら永続性を保証する為、
コミットの度に必ず最低1回、DirectI/Oが発生する。
HDDのスペックが下記の通りだと仮定する。
回転数:10000rpm
平均回転待ち時間:3ms (60000ms / 10000rpm)
平均シーク時間 :9ms
平均アクセス時間は
平均シーク時間+平均シーク時間+データ書き込み時間
なので、データ書き込み時間は無視するとして、
1回のコミット辺り、12msの待ち時間が必要となる
データの件数が20,000件なので、処理時間5分の内、なんと4分がコミットによる待ち時間だということになる。
ここからが本題
20万件のDB上のログテーブルを削除するバッチがある。
これが1時間たっても終わらず、業務の開始に合わないという事態が発生した。
理由は・・・
さて、ここまですべて基本情報技術者の試験範囲なわけだが、
君は応用情報技術者試験持ってるのに、ここまで説明して何故解ってくれない?
大事な値なので2回足しました (スコア:0)
重箱の隅で申し訳ないですが
> 平均シーク時間+平均シーク時間+データ書き込み時間
一方は『平均回転待ち時間』の間違いですよね。
Re:大事な値なので2回足しました (スコア:1)
ですね。すいませんミスです。
Re: (スコア:0)
自分の日記ならログインした状態でタイトルの左の歯車マークから編集できますよー。
# 既にご存知でしたら失礼しました。