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

Posted

技术标签:

【中文标题】优化实体框架查询 - 超时已过期【英文标题】:Optimizing Entity Framework Query - Timout Expired 【发布时间】:2012-07-31 17:09:45 【问题描述】:

我在实体框架中有 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 条记录,我不明白为什么简单的 group by 会超时。你对我应该怎么做有什么建议吗?由于我使用的是 Entity Framework 4.1,我想从实现中抽象出数据库,所以我想要一个不会改变数据库引擎本身的任何东西的解决方案。 索引 f1 或 f2(或两者)字段可以让我更快地查询吗?如果是这样,有人可以解释索引的概念以及在 Enfity Framework 中如何做吗? 我不认为增加超时应该是我应该解决的唯一解决方案,我担心随着更多数据的到来,问题仍然存在。

编辑: 我已经尝试过here 提到的关于 EF 迁移的内容。

我有这门课:

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");
        
    

但是,这段代码什么时候被调用?我在控制台中看不到打印语句。

【问题讨论】:

UpDown 方法在应用程序启动时自动调用(如果您有默认的 DB 初始化程序),或者当您在包管理器控制台中显式键入 update-database 时。在后一种情况下,控制台输出消失在黑洞中。 【参考方案1】:

您要做的第一件事是检查性能问题出在哪里。启动 SQL Server 探查器实例,然后运行执行查询的代码。捕获实际的 SQL 查询运行并检查它需要多长时间。

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

如果查询本身很快,那么 EF 对结果的处理就是问题所在(在这种情况下我对此表示怀疑)。

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

【讨论】:

有没有一种简单的方法可以让模型中的 f1 和 f2 列索引?顺便说一句,我正在使用 Code-First 方法。 您必须在迁移步骤中完成。不支持通过在模型类中包含属性来创建索引。 索引已添加,但超时问题依然存在。你知道我如何以编程方式增加超时 我建议您仔细查看执行计划,看看是否需要更多索引。达到超时是一个真正错误的暗示。否则,你最好问一个新问题。随着这个被接受的答案“关闭”,它的浏览量将非常低。

以上是关于优化实体框架查询 - 超时已过期的主要内容,如果未能解决你的问题,请参考以下文章

如何在 EF Core 3.1 中使用脚手架流程更新我的实体 - 执行超时已过期

尝试运行短过程时查询超时已过期

在 SQL Server 2008 中执行视图时出现“超时已过期”错误

关于查询报表总是"超时已过期"的问题解决

SqlException:超时已过期

[Microsoft][ODBC SQL Server Driver]超时已过期