使用LINQ to SQL查询大表(10M +行)会导致超时

时间:2011-01-11 21:31:43

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

我看到与使用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语句没问题,所以我认为这不是索引问题。

2 个答案:

答案 0 :(得分:2)

这可能比LINQ更多地是SQLServer问题。 您需要在TRANS_DATESTATE_NO上设置覆盖索引。如果你没有,那就解释了问题,这不是LINQ问题。

答案 1 :(得分:2)

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

生成SQL脚本需要花费时间。

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

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

这将帮助您解决问题。

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

另一个人认为您要考虑使用ToTraceString来查看EF为您的linq生成的内容。

但是,如果上述内容对您没有任何帮助,那么您必须向我们提供您的异常详细信息/堆栈跟踪,以便为我们提供有关这一切的全部信息。