none
DBDataReaderでのOracleからのデータ抽出が遅い RRS feed

  • 質問

  • ご存知の方がいらっしゃいましたら、ご教授ください。

    現在VisualStudio2005(C#)でSQLServer2005へ接続しているアプリのDBをOracle10gに変更することを検討していますが、Insert系は遜色無いもののSelectがかなり遅いため調査をしていたところ、DBDataReaderのイニシャライズやReadのパフォーマンスがかなり遅いため、トータルで相当パフォーマンスが劣化しています。DataAdapterでDataSetに取り込む方法でもパフォーマンスに変化はありませんでした。

    Oracle側の設定の問題かもしれませんが、もし.NET側で別の方法に置き換えることでパフォーマンスが改善されるなどの情報があれば教えてください。

    よろしくお願いします。

    以下検証時のサンプルです(時間の表示部分がお粗末ですが突っ込まないでください)。

            private void Test(string factname, string connname)
            {
                fact = DbProviderFactories.GetFactory(factname);
                DbConnection conn = fact.CreateConnection();
                conn.ConnectionString = connname;
                conn.Open();
                try
                {
                    DbCommand cmd = fact.CreateCommand();
                    Console.WriteLine(DateTime.Now.ToLongTimeString() + "." + DateTime.Now.Millisecond.ToString("000"));
                    for (int i = 0; i < 1000; i++)
                    {
                        cmd.Connection = conn;
                        cmd.CommandText = string.Format("select A from AAA where A = '{0}'", i.ToString("0000"));
                        DbDataReader reader = cmd.ExecuteReader();
                        while (reader.Read()) { }
                        reader.Close();
                    }
                    Console.WriteLine(DateTime.Now.ToLongTimeString() + "." + DateTime.Now.Millisecond.ToString("000"));
                }
                finally
                { conn.Close(); }
            }

     

    2007年3月7日 1:03

すべての返信

  • OTN から最新の ODP.NET を使っても遅いのですか?
    http://otn.oracle.co.jp/software/tech/windows/odpnet/index.html

    ループの仕方に問題がありそうですが。
    DbDataReader を毎回呼び出す意味は?
    SELECT を何度も 1000 も呼び出してパフォーマンスを計測する意味は?

    2007年3月7日 1:18
  • 忘れてた、インデックス作成してますか?Oracle のテーブルで。
    2007年3月7日 2:04
  • インデックスはPKのみで、抽出時にはそれが効いています。

    ループ無いでDbDataReaderのインスタンシングをしているのは単にそのパフォーマンスが遅いと思われるためです。実際のアプリでは1回の処理で複数テーブルに複数のクエリを発行しているため実質DbDataReaderが複数作成されるためその処理をこういった形で再現しています。

     

    2007年3月7日 4:03
  • ODP.NETは使用していないので、それが問題かもしれません。

    今から検証してみます。情報ありがとうございます。

    2007年3月7日 4:19
  • ODP.NET をインストールしても変化はありませんでした。

    DBのパラメータ等の関係もあるかもしれませんが、同一処理において4倍程度違うため別の原因かと思うのですが。

    2007年3月7日 7:14
  • ご忠告までに、

     moflo さんからの引用
    ODP.NET をインストールしても変化はありませんでした。

    インストールするだけでは変化がないのは当然だと思います。

    2007年3月7日 7:19