繁体   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