3

次のコード (Variant DataReader) を使用しています。

public DataTable dtFromDataReader(list<String> lstStrings)
{

    OleDBConn_.Open();
    using (OleDbCommand cmd = new OleDbCommand())
    {

        DataTable dt = new DataTable();
        OleDbDataReader reader = null;
        cmd.Connection = OleDBConn_;
        cmd.CommandText = "SELECT * from TableX where SUID=?";

        foreach (String aString in lstStrings)
        {
            cmd.Parameters.AddWithValue("?", aNode.SUID);
            reader = cmd.ExecuteReader();

            if (reader != null)
                dt.Load(reader);
            cmd.Parameters.Clear();
        }
        return dt;
    }
}

(Variant DataAdapter) と比較します。

public DataTable dtFromDataAdapter(list<String> lstStrings)
{
    dt = new DataTable();

    foreach (string aString in lstStrings)
    {
        sOledb_statement = String.Concat("SELECT * FROM TableX where SUID='", aString, "'");
        OleDbDataAdapter oleDbAdapter;
        using (oleDbAdapter = new OleDbDataAdapter(sOledb_statement, OleDBConn_))
        {
            GetOleDbRows = oleDbAdapter.Fill(dt);
        }
    }
}

オフライン データベース (Microsoft Access) に接続すると、読み取り時間は (取得したアイテムが ~1.5k) になります。

  • データリーダー 420 ミリ秒
  • データアダプタ 5613 ミリ秒

Oracle サーバーから読み取る場合 (~30k の取得アイテム):

  • データリーダー 323845ミリ秒
  • DataAdapter 204153 ミリ秒 (いくつかのテスト、時間はあまり変わりません)

コマンドの順序を変更しても (dataadapter を datareader の前に) 変更しても、あまり変化しませんでした (事前キャッシュが行われた可能性があると思いました..)。

DataTable.Loadよりもやや速いはずだと思いましたDataAdapter.Fillか?

そして、結果を見ても、もっと速いはずだと今でも信じています。私はどこで時間を失っていますか?(未処理の例外はありません..)

4

1 に答える 1

2

あなたの比較は、実際には、コード設定の方法でのアダプターとデータリーダーではありません。あなたは実際にAdapter.FillメソッドとDataTable.Loadメソッドを比較しています。

DataReaderは通常、レコードごとに高速になります。これは、レコードを一度に1つずつトラバースし、各レコードを読み取るときにそれに応じて反応できるためです。

どちらの場合もDataTableを返すため、Adapter.Fillメソッドを使用するのがおそらく最適です。それはまさにそれを行うように設計されました。

于 2012-09-05T13:56:04.133 に答える