数据库查询性能:.net中读取器迭代速度慢

时间:2012-06-21 10:37:42

标签: c# .net sql sql-server

我有一个像这样的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

我在.net 4(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);
}

在SQL Server Management Studio中运行此查询比从.net快得多。从.net到迭代遍历行极其缓慢。我认为这个内连接会导致这个(?),因为我的其他不包含连接的查询在.net下非常快。

我可以从.net提高查询性能吗?使用数据集而不是像这样的读者或sg?

非常感谢!

2 个答案:

答案 0 :(得分:1)

这不会真正修复查询,但会更有效地从查询中获取数据。 仅按名称返回所需的列。 Reader应该比数据集更快。

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个对象行,看看是否可能是瓶颈。

答案 1 :(得分:0)

您是否使用Table2中的所有列名?如果没有,则仅指定所需的列名称,并消除返回的数据集的一些开销。即使你使用了所有这些,使用命名列是一个很好的习惯。