ODP.NETのDataTable.Loadメソッドのパフォーマンス

CV.netの共通Classの中でDBの問い合わせQueryをDataTableとして返すメソッドがある。

半年ぐらい前に.NET2.0からDataTableに新たにLoadメソッドがあるのを知って、whileループからLoadメソッドに変更した。(whileループだと10行ぐらいの処理がLoadでは1行で済むから)
今日、ふとwhileループに比べてLoadメソッドは本当に速いのか?もしかしたらパフォーマンスが悪くなっているのではないかと心配になり調査した。

<<whileループを使ったコード>>
dr_wrk = cmd_wrk.ExecuteReader();
dr_wrk.FetchSize = 262144; // 256KB(default64KB)
for (int i=0; i

<<Loadメソッドを使ったコード>>
dr_wrk = cmd_wrk.ExecuteReader();
dr_wrk.FetchSize = 262144; // 256KB(default64KB)
ret_data.Load(dr_wrk, LoadOption.Upsert);

以下、数千件のデータの読み込みのパフォーマンス検証結果。

  • Whileループ処理秒=(1回目)12.6875, (2回目)12.515
  • Load処理秒(オプションOverwriteChanges)=(1回目)12.53125, (2回目)12.656250
  • Load処理秒(オプションPreserveChanges)=(1回目)12.5625, (2回目)12.8125, (3回目)12.3906
  • Load処理秒(オプションUpsert)=(1回目)12.5625, (2回目)12.48

パフォーマンスはほとんど同じであることがわかった。
であれば、やはりソースの可読性がよくなることから、Loadメソッドを使ったほうがよいという結論になる。

追記:
ところで、CV.netのDBアクセス共通ルーチンは、上記のようにSQL Query文を処理した結果を全てDataTableとして返すようにして、.NET側での扱いを簡単にしている。
しかしながら、DBマガジン3月号の「超達人が教える現場主義のO/Rマッピング」(P76-)を読むと、わざわざDBレイアウトと一致させたClassを定義して、オブジェクトを生成させている。(言語はJavaだが...)
JavaでもResultSet型という便利なものがあるので、SQL文とパラメータ配列を渡して普通にResultSet型で返す汎用Classを1個作ればO/Rマッピングツールいらないんじゃないかといつも思ってしまう...
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/sql/ResultSet.html


MEMO(36893)