The road to C# master trapemiya

C#を中心に、.NETの話題を取り上げます。

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  256  : 記事  1  : コメント  10763  : トラックバック  30

ニュース

Since 2005年10月26日

わんくま同盟

わんくま同盟

Microsoft MVP


Visual Developer - Visual C#

記事カテゴリ

書庫

日記カテゴリ

大量にデータベースを読んで、大量にデータベースに書き戻す処理があるんですが、それをDataReaderでバッチ処理のようにやっています。パフォーマンスを上げようと思って調べていたんですが、

int hoge = (int)myDataReader["hogehoge"];

と書くなら、以下のようにGetInt32のようなGetxxxシリーズを使った方が、パフォーマンス的に良いようですね。なぜなら、毎回hogehogeの列名で探しに行くからだそうです。

int hoge = myDataReader.GetInt32(1);

ここで気になるのは、直接インデックスを書いているんでその保守性ですが、DataReaderを使って値を読むような場合は、大抵自分でselect文を書いて読んでいるだろうから、将来select文が変わってインデックスがずれることはあまり心配しなくてもいいのかもしれません。
どうしても気になるなら、GetOrdinalを使えば、列名からインデックスが得られるので、以下のようにしておけば良いでしょう。

int index = myDataReader.GetOrdinal("hogehoge");

while (myDataReader.Read())
{
    int hoge = myDataReader.GetInt32(index);
        ・
        ・
        ・
}

あと、以下のページも参考になります。

チェックリスト: ADO.NET パフォーマンス
http://www.microsoft.com/japan/msdn/enterprise/pag/scalenetcheck01.asp

投稿日時 : 2006年1月18日 17:50

コメント

# re: DataReaderのパフォーマンスを上げる。 2006/01/19 9:21 中博俊
ストアドにすべし(^^

# re: DataReaderのパフォーマンスを上げる。 2006/01/19 12:07 trapemiya
予想してました。(^^;
ちょっと複雑なことしてから書き戻してるんで、今一歩踏み切れなかったんですが、ストアド化にトライしてみようかと思っています。無理ならSQL CLRなんでしょうが、VS2003で開発してるんで、これも難しい。将来的には、VS2005で完全に作り直すつもりですが。
#mixiでおぎわらさんがストアドのデバッグ方法を軽く載っけてたなぁ。

Post Feedback

タイトル
名前
Url:
コメント