2012-07-31 36 views
0

我在實體框架中有兩個非常簡單的查詢,該列由外鍵列組成。換句話說,表中的字段有:優化實體框架查詢 - Timout已過期

pk : Primary key 
name : name of object 
f1: foreign key1 
f2: foreign key2 
... 

我收到超時異常,尤其是這一個:

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 

的查詢是:

var q = from x in db.Table select x; 
var query_1 = q.GroupBy (record => record.f1); 
var query2 = q.GroupBy(record => new {record.f1, record.f2}); 

我有大約3萬條記錄數據庫和我不明白爲什麼一個簡單的組會超時。你有什麼建議我該怎麼做?由於我使用的是實體框架4.1,我想從實現中抽象出數據庫,所以我想要一個解決方案,它不會改變數據庫引擎本身的任何東西。 可以索引f1或f2(或兩者)字段讓我更快的查詢?如果是這樣,有人可以解釋索引的概念以及如何在Enfity框架中做? 我不認爲增加超時應該是我應該解決的唯一解決方案,恐怕問題會隨着更多數據的來臨而保持。

編輯: 我已經試過什麼提到here約EF遷移。

我有這個類作爲結果:

namespace DataAccessLayer.Migrations 
{ 
    using System; 
    using System.Data.Entity.Migrations; 

    public partial class IX_Table1_fId : DbMigration 
    { 
     public override void Up() 
     { 
      Console.WriteLine("Creating Index"); 
      CreateIndex("Table1", "fId"); 
      Console.WriteLine("Index Created"); 
     } 

     public override void Down() 
     { 
      DropIndex("Table1", "IX_Table1_fId"); 
     } 
    } 
} 

然而,當這段代碼被調用?我沒有看到控制檯中的打印語句。

+0

在應用程序啓動時(如果您有默認數據庫初始值設定項),或者在包管理器控制檯中顯式鍵入'update-database'時,會自動調用'Up'和'Down'方法。在後一種情況下,控制檯輸出消失在黑洞中。 – 2012-07-31 19:04:28

回答

1

你必須做的第一件事是檢查性能問題。啓動一個SQL Server分析器實例,然後運行執行查詢的代碼。捕獲實際的SQL查詢運行並檢查需要多長時間。

如果是SQL執行需要時間,分析它的最簡單方法是將其粘貼到SQL Server Management Studio並從那裏運行並檢查查詢計劃。它會建議添加哪些索引。

如果查詢本身速度很快,那麼處理結果的EFs就是問題(我懷疑在這種情況下)。

如何在數據庫上應用索引取決於您如何處理數據庫模式。如果您使用EF Migrations從代碼更新架構,則可以將索引作爲separate migration steptogether with the table creation添加。

+0

有沒有簡單的方法來製作模型中的f1和f2列索引?順便說一句,我使用的是Code-First方法。 – 2012-07-31 17:27:59

+0

您必須在遷移步驟中完成。通過在模型類中包含屬性不支持創建索引。 – 2012-07-31 17:29:40

+0

我已經添加編輯到我的問題。感謝您的幫助 – 2012-07-31 18:36:23