我們最近開始使用complied查詢來提高我們的Linq to SQL設置的性能。有幾個查詢總是需要幾秒鐘的時間才能在第一次運行時在第二次運行中第一次運行。這似乎是因爲編譯實際上並沒有發生,直到第一次打電話。爲什麼我的編譯linq查詢第一次放緩?
是否有一種簡單的方法可以在編譯程序期間或至少在啓動過程中強制執行此編譯?
編輯: 所以從我看到的看來,它看起來像linq查詢是絕對不會編譯,直到進行調用。現在我正在寫我這樣的查詢:
static readonly Func<DataContext, int, IQueryable<Item>> getByPLUComp =
CompiledQuery.Compile<DataContext, int, IQueryable<Item>>((db, PLU) =>
from i in db.Items
where i.IntPLU == PLU && i.Terminated == null
select i);
我有一堆這些靜態只讀Funcs漂浮。有沒有一種簡單的方法,我可以讓我的程序運行並在啓動時將它們初始化,以便在那裏發生成本,而不是在正常使用期間發生?
編輯2: 我放棄這個問題之前的最後一次嘗試。爲了解決這個問題,我剛剛在程序的初始化過程中添加了對編譯查詢的調用。例如:
public void Initialize()
{
DataContext db = new DataContext();
getByPLUComp(db, 0);
}
是否有更優雅的方式來強制編譯,而不僅僅是運行查詢並丟棄結果?
你確定它不只是因爲你讓首次到數據庫的連接?或者說,延遲不是來自sql服務器端,這是一個緩存問題? – cyberconte 2010-01-05 20:15:52
有問題的查詢不是應用程序運行的第一個查詢。問題也是一致的。每次程序運行時都會發生這種情況。 – Mykroft 2010-01-05 20:21:23
你可能會發現這一系列的博客文章很有趣:http://blogs.msdn.com/ricom/archive/2007/06/22/dlinq-linq-to-sql-performance-part-1.aspx - 對編譯查詢進行編譯直到第一次使用纔會被編譯。其中一個帖子應該闡明爲什麼這項政策存在。 – jalf 2010-01-05 20:46:21