次のコード (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
か?
そして、結果を見ても、もっと速いはずだと今でも信じています。私はどこで時間を失っていますか?(未処理の例外はありません..)