(続)JDBCに関するふとした疑問
ちょっと時間が空きましたが、前回の日記で書いた疑問の検証をやってみました。
前回残った疑問は、
- カラム数が多いと変換処理のオーバヘッドが無視できなくなるのでは無いか?
- 変換処理が配列の走査で実現されているドライバが無いか?
でしたので、まず、
「変換処理がHashMapによる検索で実現されているドライバ(eg. PostgreSQL)」と
「変換処理がListの走査で実現されているドライバ」の、
処理速度の比較をやってみました。
本当にDBMSから検索した結果で調べるのが正しいのですが、
時間がないのでまずはそれらしいプログラムを作ってシミュレーションです。
とりあえず、10000レコードを処理するとして、
カラム数を、100 → 200 → 400 → 800
と変化させた時の所要時間を測定してみました。
(CPUはCore2 Duo T8100/2.1 GHz、です。)
カラム数 | HashMap | List |
---|---|---|
100 | 112 | 2588 |
200 | 61 | 8481 |
400 | 117 | 28979 |
800 | 218 | 131359 |
(単位:ミリ秒)
…という事で、カラム数が400まで達すると30秒、
800に達すると130秒のオーバヘッドが生じる計算になります。
まあ、それほどでも無いですね。
これを多いと見るか、少ないと見るか・・・、
基本的には影響無いレベルですが、
SQLによっては、響くケースもあるかも知れませんね。
バッチ処理だとレコード数がこの10倍、100倍という事もあるので、
オーバヘッドも無視できない値になるかも知れません。
(400カラムのテーブルを10万件処理すると、
5分のオーバヘッドが生じるというのは、
結構、大きいかも・・・)
…ところで、こんな事が疑問になったのも、
ENdoSnipeでDBアクセスの処理時間を計っていたら、
思いのほか、CPU使用時間が長い場合があったからです。
お使いのJDBCによっては、
オーバヘッドが無視できないものも、
あるかも知れませんね。
というわけで、
- カラム数が多いと変換処理のオーバヘッドが無視できなくなるのでは無いか?
の検証はできました。
残る、
- 変換処理が配列の走査で実現されているドライバが無いか?
もやってみたいところですが、公表が難しそうですね。
…というわけで、実施は見送ると思いますが、
気になる方は、調べてみて下さい。