2010-03-11 52 views
2

我有一個動態創建的LINQ to SQL查詢。有趣的是,當我在SQL Management Studio中運行它時,它閃電般快速。當我從L2S運行它時,它會在一段時間後變得很慢。如何強制將Linq的執行計劃重新編譯爲SQL查詢?

這可能是因爲查詢計劃/執行計劃。當我重新啓動SQL Server時,L2S查詢又閃電般快。

現在用T-SQL你可以用WITH RECOMPILE。但如何與L2S做到這一點?

+0

在99%的情況下,您不應該需要WITH RECOMPILE;它通常是您正在治療的症狀,而不是真正的原因... – 2010-03-11 07:57:21

回答

0

查看CompiledQuery類。這裏有一個來自微軟的tutorial,更詳細的內容。

+0

這是完全不同的 – 2012-06-05 18:41:18

0

;)你沒有。 Simlpe。沒有暴露。

但動態查詢不應該需要「WITH RECOMPILE」。檢查管理工作室中的查詢是否緩慢......所有用戶共享執行路徑。

難道不是SQL Server的速度慢嗎?但是LINQ(即客戶端處理)?

您運行的查詢是什麼?

+1

查詢計劃仍將被重用。您可以像存儲過程一樣運行相同的參數嗅探問題。使用SSMS進行檢查可能會導致略微不同的文本和與L2S不同的計劃。 – 2012-06-05 18:42:13

2

從您描述的行爲中,您的統計信息幾乎肯定會過時。

我建議你重建他們:

exec sp_MSForeachTable 'UPDATE STATISTICS ?' 
3

正如我在下面的線程中,你可以使用DataContext.GetCommand(IQueryable)獲得DbCommand您要執行查詢。您可以在命令文本中添加「WITH(RECOMPILE)」,然後打開一個閱讀器,然後使用DataContext.Translate<T>將打開的閱讀器轉換爲您想要的實體類型。

http://social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/def80609-eaf2-4631-8d3d-ad10fc9aedfa

+0

但是它似乎不適用於某些加載選項。 DataContext.Translate 可能會開始執行另一個SQL命令並失敗,因爲當前命令仍然使用該連接。 – 2012-09-19 13:06:06

0

我用這個EF 6 Parameter Sniffing在SQL的端部執行之前添加命令「選項(重新編譯)」。它適合我。如何解決它是非常好的解決方法。