EF Linq查询比存储过程慢100倍

时间:2015-02-19 19:05:09

标签: c# entity-framework

我运行了一个测试执行Linq查询,与使用EF DataContext中的存储过程调用相比。似乎存储过程调用快了大约100倍 - 为什么会这样?

LINQ示例:

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

存储过程:

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

调用存储过程

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查询。

它看起来像这样

选择        [EXtent1] .COL1,        [Extent2] .COL2    从table1作为extent1        左外连接表2为extent2

如果我执行上述查询,则每次执行需要9秒。有趣的是,如果我从选择列表中删除COL2,它将在2秒内执行。

为什么从选择列表中删除列会提高速度?现在这是在EF和LINQ之外,这是sql中的一个问题

1 个答案:

答案 0 :(得分:0)

要审核的事项

  • 存储过程中是否存在任何不在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