(続)JDBCに関するふとした疑問

ちょっと時間が空きましたが、前回の日記で書いた疑問の検証をやってみました。


前回残った疑問は、

  1. カラム数が多いと変換処理のオーバヘッドが無視できなくなるのでは無いか?
  2. 変換処理が配列の走査で実現されているドライバが無いか?

でしたので、まず、
「変換処理がHashMapによる検索で実現されているドライバ(eg. PostgreSQL)」と
「変換処理がListの走査で実現されているドライバ」の、
処理速度の比較をやってみました。


本当にDBMSから検索した結果で調べるのが正しいのですが、
時間がないのでまずはそれらしいプログラムを作ってシミュレーションです。


とりあえず、10000レコードを処理するとして、
カラム数を、100200400800
と変化させた時の所要時間を測定してみました。
(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によっては、
オーバヘッドが無視できないものも、
あるかも知れませんね。


というわけで、

  1. カラム数が多いと変換処理のオーバヘッドが無視できなくなるのでは無いか?


の検証はできました。
残る、

  1. 変換処理が配列の走査で実現されているドライバが無いか?


もやってみたいところですが、公表が難しそうですね。
…というわけで、実施は見送ると思いますが、
気になる方は、調べてみて下さい。