[英]When should I use a CompiledQuery?
我有一張桌子:
-- Tag
ID | Name
-----------
1 | c#
2 | linq
3 | entity-framework
我有一個類將有以下方法:
IEnumerable<Tag> GetAll();
IEnumerable<Tag> GetByName();
在這種情況下我應該使用編譯查詢嗎?
static readonly Func<Entities, IEnumerable<Tag>> AllTags =
CompiledQuery.Compile<Entities, IEnumerable<Tag>>
(
e => e.Tags
);
然后我的GetByName
方法將是:
IEnumerable<Tag> GetByName(string name)
{
using (var db = new Entities())
{
return AllTags(db).Where(t => t.Name.Contains(name)).ToList();
}
}
它生成一個SELECT ID, Name FROM Tag
並在代碼上執行Where
。 或者我應該避免在這種情況下使用CompiledQuery
?
基本上我想知道何時應該使用編譯查詢。 此外,在網站上,他們只為整個應用程序編譯一次?
當滿足以下所有條件時,您應該使用CompiledQuery
:
IEnumerable<T>.Contains()
這樣的LINQ功能,它不能與CompiledQuery
。 CompiledQuery
在第一次執行查詢時執行其工作。 它對第一次執行沒有任何好處。 與任何性能調優一樣,通常在您確定要修復實際性能熱點之前避免它。
2012更新: EF 5將自動執行此操作(請參閱“ 實體框架5:控制自動查詢編譯 ”)。 所以在上面的列表中添加“你沒有使用EF 5”。
編譯的查詢可以節省您的時間,這將花費在生成表達式樹上。 如果經常使用查詢並且您將保存已編譯的查詢,那么您一定要使用它。 我有很多情況,當查詢解析比實際往返數據庫花費更多時間。
在您的情況下,如果您確定它將生成SELECT ID, Name FROM Tag
而沒有WHERE
情況(我懷疑,因為您的AllQueries
函數應該返回IQueryable
並且實際查詢應該僅在調用ToList
) - 您應該'使用它。
正如有人已經提到的那樣,在較大的表上, SELECT * FROM [someBigTable]
將花費很長時間,你將花費更多的時間在客戶端過濾它。 因此,無論您是否使用編譯查詢,都應該確保在數據庫端進行過濾。
編譯查詢對於linq查詢更有幫助,大型表達式樹表示復雜查詢可以在重用查詢時反復構建表達式樹。 在你的情況下,我想它會節省很少的時間。
編譯應用程序時會編譯編譯的查詢,並且每次經常重用查詢或復雜時,都應該嘗試編譯查詢以加快執行速度。
但是我不會在所有查詢中使用它,因為它需要更多的代碼來編寫,對於簡單的查詢,它可能不值得。
但是為了獲得最佳性能,您還應該評估在數據庫服務器上執行所有處理的存儲過程,即使Linq嘗試盡可能多地將工作推送到數據庫,您也會遇到存儲過程更快的情況。
編譯的查詢可以提高性能,但並不是很大。 如果您有復雜的查詢,我寧願使用存儲過程或視圖,如果可能的話; 讓數據庫做它可能是一個更好的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.