簡體   English   中英

EF Linq查詢比存儲過程慢100倍

[英]EF Linq query is 100x slower than stored procedure

與使用EF DataContext的存儲過程調用相比,我運行了一個測試執行Linq查詢。 並且看起來存儲過程調用快了大約100倍 - 為什么會這樣?

LINQ示例:

 var results = (from I in db.MyTable
                select I).toList();

存儲過程:

  ....
  SELECT * 
  FROM myTable T
    INNER JOIN TABLE2
    INNER JOIN TABLE3

CALL到存儲過程

var results = this.Database.SQlQuery<MyModel>("spMyStorePro").ToList()      

Linq執行需要10-15秒,而存儲過程調用將花費1-2秒,如果不是更少。

該模型包含幾個實體

 MyTableModel
      public int KEY {Get;set;}

      public virtual TABLE1 table1Info {get; set;}
      public virtual TABLE2 table2Info {get; set;}

這是常見的還是我錯誤地設置了我的模型?

我要提到的一件事是我的MODEL有一些嵌套模型可能會導致性能下降。

更新

所以我找到了一些有趣的東西:

我從LINQ吐出的sql監視器中獲取sql查詢。

它看起來像這樣

SELECT [EXtent1] .COL1,[Extent2] .COL2 FROM table1 as extent1 left outer join table 2 as extent2

如果我執行上述查詢,每次執行需要9秒。 有趣的是,如果我從選擇列表中刪除COL2,它將在2秒內執行。

為什么從選擇列表中刪除列會提高速度? 現在這不在EF和LINQ之內,這是sql中的一個問題

要檢討的事情

  • 您的存儲過程中是否存在任何不在EF查詢中的WHERE子句
  • 存儲過程是否返回嵌套層次結構
  • 當你說你的“模型有多個嵌套模型”時,你是否嘗試過代碼優先配置關系,並排除不必要的子/后代? 見下文...

var query = context.Query<Thing>(
       include: t => t.Child.Select(v => v.Grandchild))
       .Where(t => t.Foo == "bar"); // includes descendants

var query = context.Query<Thing>()
       .Where(t => t.Foo == "bar"); // excludes descendants

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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