【问题标题】:Using LINQ to SQL to query large table (10M+ rows) results in timeout使用 LINQ to SQL 查询大表(10M+ 行)导致超时
【发布时间】:2011-01-12 05:57:00
【问题描述】:

我看到了与使用 LINQ to SQL 执行查询相关的超时问题。所以我制作了一个简单的控制台程序,但问题仍然存在,并非总是如此,但随机出现的次数足以让我担心。这几乎是我的整个程序:

    public static TransactionDataContext DataContext = new TransactionDataContext();

    static void Main(string[] args)
    {
        int year = ...;
        int stateCode = ...;

        DateTime minYear = new DateTime(year, 01, 01);
        DateTime maxYear = new DateTime(year, 12, 31);

        var volumes = DataContext.TRANSACTIONs.Where(p =>
                p.STATE_NO == stateCode &&
                p.TRANS_DATE >= minYear &&
                p.TRANS_DATE <= maxYear).OrderBy(p => p.TRANS_DATE);

    }

我数据库中的 TRANSACTION 表有 10M+ 条记录。在最后一个右大括号处设置断点后,我运行调试器。有时,扩展体积变量和结果视图会显示数据,有时它会显示“功能评估超时”。通过设置 DataContext.CommandTimeout 来延长超时似乎没有帮助,而且我认为这不是解决方案。

我的问题是为什么 LINQ to SQL 有这种限制,或者我做错了什么。

更新:从 Management Studio 运行 SQL 语句是可以的,所以我认为这不是索引问题。

【问题讨论】:

  • 在调试时尝试运行 SQL Query Profiler,然后您可以找到正在执行的 SQL 查询,并通过查询分析器运行它以查看阻塞情况。
  • 在调试器外部运行查询时是否有超时问题?调试器有自己的读取变量值的超时时间。
  • 只是为了维护@Micheal的观点وDo you have a timeout issue when the query is run outside the debugger?

标签: sql-server linq linq-to-sql


【解决方案1】:

这可能是一个 SQLServer 问题,而不是 LINQ。 您需要一个覆盖索引TRANS_DATESTATE_NO。如果你没有,那可以解释问题,这不是 LINQ 问题。

【讨论】:

    【解决方案2】:

    我认为问题不是因为您有 10M 条记录,因为查询还没有执行(因为您没有调用 ToListToArray)。

    需要时间的是 SQL 脚本的生成。

    我认为首先删除一些查询参数,例如,删除OrderBy,并将Where 设置为仅p.STATE_NO == stateCode,然后检查会发生什么。

    然后,逐步添加一些参数,您就会看到导致问题的原因。 甚至可能不支持这种日期比较,或者可能是STATE_NO与stateCode的类型不同,我不确定,我只是在大声思考。

    这将帮助您解决问题。

    您还需要测试使用 Entity-SQLprogrammatically(甚至是硬编码查询)来塑造您的查询(无 linq),这将帮助您解决问题。

    您要考虑的另一个想法是使用 ToTraceString 查看 EF 为您的 linq 生成的内容。

    但是,如果上述内容对您没有任何帮助,您将不得不向我们提供您的异常详细信息/堆栈跟踪,以便我们了解这一切是怎么回事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 2019-06-17
      • 1970-01-01
      相关资源
      最近更新 更多