2012-04-06 116 views
3

我已經繼承了一些C#/ ASP.NET MVC /實體框架項目緩慢。數據庫中沒有太多數據,但致電.Include()導致速度變慢。實體框架+ LINQ緩慢與字符串查詢速度?

但是,我發現了一些很奇怪的東西。我有一個只有數字(5列)的2k行表。我在我正在搜索的列上有索引。

在做:

_entities.MyTable.Where(x=> x.Id1 == 4 && x.Id2 == 5).First() 

它需要我的開發機器上1800ms。

然而,當我這樣做:

_entities.MyTable.Where("it.Id1 = 4 and it.Id2 = 5").First() 

它需要像10毫秒。

這是怎麼回事?我不明白爲什麼LINQ表達式會這麼慢。

+1

嘗試在LinqPad中解開它,並將其生成的SQL查詢與您自己的 – Tigran 2012-04-06 07:04:30

+0

進行比較是否在任何實體中繼承MyTable? – daryal 2012-04-06 07:23:19

+0

@daryal對不起,在EF的情況下,我仍然是一個小菜鳥,那會是什麼樣子?這個對象/模型與其他對象有關。表中的數字是其他表的外鍵。 – 2012-04-06 07:25:34

回答

0

打開Sql Profiler,查看來自EF的查詢。嘗試分析它,制定計劃。似乎EF以奇怪的方式執行查詢,而沒有獲取索引。

+0

因爲我正在運行SQL Express,所以我的開發箱上沒有配置文件。任何其他方式來做到這一點?我讓SQL Server Management Studio運行/調試查詢。 – 2012-04-06 07:04:10

+0

不知道這裏是否允許在其他資源上發佈鏈接,但谷歌「SQL服務器獲取所有查詢」。有很多方法可以在沒有profiler的情況下運行查詢 – 2012-04-06 07:14:10

+0

我使用的LinqPad基於上面的建議,它和String方法一樣快,但參數的順序很奇怪......它在做「where(4 = Id1 )和(5 = Id2)「而不是Id1 = 4和Id2 = 5。雖然在LinqPad中看起來並沒有讓性能大打折扣。 – 2012-04-06 07:16:02

0

難道是EF需要生成SQL來執行第一個示例中的where子句,而第二個SQL更容易生成,因爲它只需插入已提供的SQL?

我發現EF在生成查詢時非常緩慢,在這種情況下,它似乎不太可能作爲它在這兩種情況下的一個相當簡單的查詢。

您是否嘗試過編譯第一個查詢並多次運行它,以檢查執行時間是否僅包括實際運行SQL,而不僅僅是生成它?