私はOracleしか使っていませんが、基本的には同じ部分も多いと思いますので、知っている範囲の話をします。
まずはレスポンス改善であれば計測しましょう。
私もレスポンス改善の際に予想していた問題点が当たるというのは半分もありません。そうして、ボトルネックを改善しないかぎり”ほんのわずか”の効果しかあげられません。
というわけで、以下の様な作業をすると良いと思います。
・ CSVの読み込みからparseの部分の時間を計測します
適切なロジックでParseしていますか?
・ Insert用のCSVの書き出しの部分の時間を計測します
ここは、あまり時間がかかる部分ではないはずなので、
この処理の何倍時間がかかっているかでどのくらい遅い処理なのか判別出来ます
・ Insertの時間を計測します
本当に時間がかかっていないのか確認する必要があります。
経験的には、Selectの何倍も時間がかかる処理で、インデックスの状態によっては、
やばいくらい時間がかかります。もちろん使ってないインデックスは削除しましょう。
また、すでにDBに登録されているで項目を登録していませんか?
項目が減らせればそれだけ処理時間が減ります。
・ 各SQLの発行からDBからのレスポンスにかかる時間を計測します
こっからが本題ですが、さっきも説明したとおりボトルネックをおさえる意味で前の項目は
必須です。
・ これでIOにかかる時間がはっきりしたので、残りの時間はCPUを使っている時間となります。
この処理で、時間がかかっている場合は、メモリを使いすぎていないかログを取ってみて下さい
すごく勝手に予想しますが、ここまでやるとSelectの発行件数の問題ではなく、重いSQLがあることのほうが問題だと思えるようになっているはずです。
・ 重い順にSQLがインデックスを使って検索しているか確認してください
インデックスを適切に設定すれば、検索時間は格段に早くなります
・ 同じ検索キーで同じSelectを発行していませんか
同じキーの検索が頻発するなら、Dictionaryクラスなどに詰めて検索結果を再利用するようにして下さい。
・ 使わない項目を検索していませんか
SQLの発行より、レスポンスのIOのほうが時間がかかっているということも多いです。
・ 副問い合わせでDB側で処理をさせてIOを減らします。
この作業は最後にすべきです。上記の改善に悪影響を及ぼす場合があるからです。
とくに、複雑すぎるSQLは”技術的負債”の典型例と言って問題ないと思います。
・ ところでDBコネクションは毎回破棄していませんか?
コネクションプールを利用できていれば問題ありませんが、DBコネクションはそれなりに重いです。
もし、レコード毎に破棄しているのであれば計測対象に含めましょう
書いていて長すぎて途中で後悔しました。読んでくださっているならもう一言だけ。
レスポンス改善は計測から始める地道な作業です。手間はかかりますが頑張ってください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/26 10:10