0

私はこのようなSQLクエリを持っています:

set @fromdate = '2012/01/01 00:00:00'
set @todate = '2013/01/01 00:00:00'

SELECT TableOne.date_time, TableTwo.* 
FROM TableOne 
INNER JOIN TableTwo ON TableOne.gprs_id = TableTwo.recordid 
WHERE date_time >= @fromdate AND date_time <= @todate

私は次のように.net4(c#)でそれを使用します:

string strSQL = "SELECT TableOne.date_time, TableTwo.* FROM TableOne INNER JOIN TableTwo ON " +
                "TableOne.gprs_id = TableTwo.recordid where date_time >= @fromdate AND date_time <= @todate";

var pCommand = pConnectionWrapper.DBConnection.CreateCommand();
pCommand.CommandText = strSQL;

var paramFromDate = pCommand.CreateParameter();
paramFromDate.ParameterName = "@fromdate";
paramFromDate.DbType = DbType.DateTime;
paramFromDate.SourceColumn = "date_time";
paramFromDate.Value = fromDate;
pCommand.Parameters.Add(paramFromDate);

var paramToDate = pCommand.CreateParameter();
paramToDate.ParameterName = "@todate";
paramToDate.DbType = DbType.DateTime;
paramToDate.SourceColumn = "date_time";
paramToDate.Value = toDate;
pCommand.Parameters.Add(paramToDate);

var pReader = pCommand.ExecuteReader();

while (pReader.Read())
{
   var someValue = double.Parse(pReader["somevalue"].ToString());
   var date = DateTime.Parse(pReader["date_time"].ToString());

   var someObject = new someObject(someValue, someDate);
   someObjects.Add(comeObject);
}

このクエリの実行は、.netよりもSQL ServerManagementStudioの方がはるかに高速です。.netからの行の反復は非常に遅いです。この内部結合が原因であると思うので(?)、結合を含まない他のクエリは.netでは非常に高速です。

.netからクエリのパフォーマンスを向上させることはできますか?このようなリーダーやsgの代わりにデータセットを使用していますか?

どうもありがとうございます!

4

2 に答える 2

1

これは実際にはクエリを修正しませんが、クエリからより効率的にデータを取得します。必要な列のみを名前で返します。リーダーはデータセットよりも高速である必要があります。

Double someValue;
DateTime date;
while (pReader.Read())
{
   someValue = pReader.GetDouble(0);
   date = pReader.GetDate(1);

   var someObject = new someObject(someValue, someDate);
   someObjects.Add(comeObject);
}

//or
while (pReader.Read())
{
   someObjects.Add(new someObject(pReader.GetDouble(0), pReader.GetDate(1)));
}

クエリに関しては、かなり基本的なようです。

2つのオブジェクト行をコメントアウトして、それがボトルネックである可能性があるかどうかを確認します。

于 2012-06-21T12:49:52.693 に答える
0

Table2のすべての列名を使用していますか?そうでない場合は、必要な列名のみを指定し、返されるデータセットのオーバーヘッドの一部を排除します。それらすべてを使用している場合でも、名前付きの列を使用するのは良い習慣です。

于 2012-06-21T11:54:42.103 に答える