簡體   English   中英

我什么時候應該使用CompiledQuery?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM