我看到一些非常奇怪的性能問題,與使用實體框架代碼優先的.NET框架版本4進行的非常簡單的查詢有關.LINQ2Entities查詢如下所示:實體框架查詢速度慢,但SqlQuery中的SQL相同速度很快
context.MyTables.Where(m => m.SomeStringProp == stringVar);
這需要超過3000毫秒的時間才能執行。生成的SQL看起來非常簡單:
SELECT [Extent1].[ID], [Extent1].[SomeStringProp], [Extent1].[SomeOtherProp],
...
FROM [MyTable] as [Extent1]
WHERE [Extent1].[SomeStringProp] = '1234567890'
此查詢在運行Management Studio時幾乎同時運行。當我改變了C#代碼使用sqlquery函數,它運行在5-10毫秒:
context.MyTables.SqlQuery("SELECT [Extent1].[ID] ... WHERE [Extent1].[SomeStringProp] = @param", stringVar);
因此,完全相同的SQL,生成的實體變化跟蹤在這兩種情況下,但之間的野生PERF差異二。是什麼賦予了?
我希望你看到初始化延遲 - 可能查看編譯。請參閱MSDN:[「實體框架5的性能注意事項」](http://msdn.microsoft.com/zh-cn/data/hh949853.aspx) –
我試過預生成的視圖,但它似乎沒有幫助。另外,在慢速之前運行另一個EF查詢以排除初始化內容。儘管在第一次查詢期間發生了上下文預熱,但新查詢很快運行,緩慢運行仍然緩慢運行。 –
@marc_s - 不,SqlQuery將返回一個完全物化和變化跟蹤的實體實例。請參閱http://msdn.microsoft.com/en-us/library/system.data.entity.dbset.sqlquery(v=vs.103).aspx –