优化实体框架查询 - 超时过期

时间:2012-07-31 17:09:45

标签: c# .net linq entity-framework query-optimization

我在实体框架中有2个非常简单的查询,这些查询按一个外键列分组。换句话说,表字段是:

pk : Primary key
name : name of object
f1: foreign key1
f2: foreign key2
...

我收到超时异常,特别是这个:

Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)

查询是:

var q = from x in db.Table select x;
var query_1 = q.GroupBy (record => record.f1);
var query2 = q.GroupBy(record => new {record.f1, record.f2});

我在DB中有大约30,000条记录,我无法理解为什么一个简单的组会超时。你对我该怎么办有任何建议吗?由于我使用的是Entity Framework 4.1,我想从实现中抽象数据库,所以我想要一个不会改变db引擎本身的任何解决方案的解决方案。 可以索引f1或f2(或两个)字段可以让我查询更快吗?如果是这样,有人可以在Enfity Framework中解释索引的概念以及如何做吗? 我不认为增加超时应该是我应该解决的唯一解决方案,我担心问题会随着更多数据的出现而继续存在。

修改 的: 我已经尝试过关于EF迁移的here提及。

我有这个课程的结果:

namespace DataAccessLayer.Migrations
{
    using System;
    using System.Data.Entity.Migrations;

    public partial class IX_Table1_fId : DbMigration
    {
        public override void Up()
        {
            Console.WriteLine("Creating Index");
            CreateIndex("Table1", "fId");
            Console.WriteLine("Index Created");
        }

        public override void Down()
        {
            DropIndex("Table1", "IX_Table1_fId");
        }
    }
}

但是,什么时候调用此代码?我没有看到控制台中的打印语句。

1 个答案:

答案 0 :(得分:1)

您要做的第一件事就是检查性能问题的位置。启动SQL Server探查器实例,然后运行执行查询的代码。捕获实际的SQL查询运行并检查所需的时间。

如果SQL执行需要时间,最简单的分析方法是将其粘贴到SQL Server Management Studio并从那里运行并检查查询计划。它将建议添加哪些索引。

如果查询本身很快,那么EFs处理结果就是问题(在这种情况下我怀疑)。

如何在数据库上应用索引取决于您处理数据库架构的方式。如果您使用EF迁移从代码更新架构,则可以将索引添加为separate migration steptogether with the table creation