2012-10-10 56 views
0

我正在進行perf練習,我想知道是否有任何機會來改善這一點,只是通過查詢此信息的方式,而不是嘗試做任何事情數據庫模式或數據更改。查詢優化挑戰 - 是否有可能調整此linq查詢

以下查詢需要大約200毫秒來執行。我知道我雄心勃勃,但挑戰在於是否有辦法打倒。我準備採用ADO.NET或使用SP或使用sql查詢,但無法做任何數據更改。另外,EmpTable有大約2000萬行。 它選擇1個與paramid相匹配的記錄。

任何人認爲這仍然有可能進一步優化?

Log.Time() 
      using (MyDataContext db = MyDataContext.GetContext()) 
      { 
       db.ObjectTrackingEnabled = false; 
       var _Query = from t in db.EmpTable 
          where t.id == paramId 
          select t; 

       if (!_Query.Any()) 
        return null; 
      } 
      Log.Time() -- 200 ms approx 
+0

您是否已經對該查詢進行了描述?代碼沒有多少改變,所以你必須考慮在表上添加一個合適的索引。 – 48klocs

+1

將數據加載到散列表中一次,然後在內存中搜索paramId。我不認爲你可以減少很多查詢執行時間。 – LeffeBrune

+1

如果性能是一個問題,我會避免使用linq,因爲它生成的sql有時可能會被混淆。 – jTC

回答

0

使用linq有一些小的開銷(但你是微觀優化)。您可以嘗試並執行原始SQL,看看是否有任何性能改變。

using (MyDataContext db = MyDataContext.GetContext()) 
{ 
    var exists = db.ExecuteQuery<bool>(@" 
     SELECT CASE WHEN EXISTS(SELECT NULL FROM EmpTable where t.id == {0}) 
     THEN CAST(1 As bit) 
     ELSE CAST(0 As bit) END", paramId); 
    if(exists) 
     return null; 
} 

GetContext()做任何事情比創建上下文嗎?

+0

GetContext花了一些時間,我優化了..標記爲答案,因爲它幫助... –

1

您的查詢看起來很簡單,您將無法改進它。

我要檢查的第一個地方是查看是否可以在爲此查詢優化的表上添加索引以提高性能。

獲取正在運行的查詢的查詢執行計劃並查找任何問題區域。這看起來像是一個可以通過數據庫調整最好解決的問題。