2012-06-21 62 views
0

緩慢讀者迭代我有一個SQL查詢是這樣的:像這樣數據庫查詢性能:在.NET

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.0(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這樣的?

非常感謝!

+0

這顯然不是你真正的代碼,在最後的while循環中......你能給我們你真正的代碼嗎?你在循環中做什麼?應該沒有理由由於聯接而導致速度變慢 - 這不像聯接在本地執行。 –

+0

你應該[獲得一個執行計劃](http://stackoverflow.com/questions/7359702/how-do-i-obtain-a-query-execution-plan)兩種情況下(運行通過SQL Server Management Studio&通過.Net代碼)並比較兩者。 – Justin

+0

我在閱讀中添加了代碼。基於DB數據的某些對象初始化沒有什麼特別 – Tom

回答

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條對象線,看看是否可能是瓶頸。

+0

謝謝,它使它快50%! – Tom

0

您是否使用Table2中的所有列名?如果不是,那麼僅指定需要的列名稱,並消除返回的數據集的一些開銷。即使你在使用它們,使用命名列也是一個很好的習慣。

+0

我需要它們,只有2個tinyint + 1 float列 – Tom