使用EF with Oracle选择Count非常慢

时间:2017-05-17 16:53:06

标签: oracle entity-framework

我将EF 5与Oracle数据库结合使用。

我在具有特定参数的表中执行选择计数。当我使用EF时,查询返回值31,如预期的那样,但结果大约需要10秒钟。

using (var serv = new Aperam.SIP.PXP.Negocio.Modelos.SIP_PA())
{
    var teste = (from ens in serv.PA_ENSAIOS_UM
                 where ens.COD_IDENT_UNMET == "FBLDY3840"
                 select ens).Count();
}

如果我执行下面的简单查询,结果是相同的(31),但结果显示在500毫秒。

SELECT 
       count(*)
  FROM 
       PA_ENSAIOS_UM
 WHERE 
       COD_IDENT_UNMET 'FBLDY3840'

当我使用EF时,有一种方法可以提高性能吗?

注意:此表格中有13.000.000行。

1 个答案:

答案 0 :(得分:1)

以下是您可以尝试的一些事项:

  1. 捕获正在生成的查询,并查看它是否与您正在使用的查询相同。可以找到详细信息here,但实际上,您将实例化DbContext(让我们调用它" _context"),然后将Database.Log属性设置为是记录方法。如果这种方法实际上没有做任何事情,那就没关系了 - 你可以在那里设置一个断点,看看发生了什么。

    所以,作为一个例子:定义一个日志记录函数(我有一个名为&#34的静态类; Logging"它使用nLog写入文件)

    public static void LogQuery(string queryData)
    {
        if (string.IsNullOrWhiteSpace(queryData))
            return;
    
        var message = string.Format("{0}{1}", 
            queryData.Trim().Contains(Environment.NewLine) ?
            Environment.NewLine : "", queryData);
        _sqlLogger.Info(message);
        _genLogger.Trace($"EntityFW query (len {message.Length} chars)");
    }
    

    然后在创建LogQuery的上下文点时:

    _context.Database.Log = Logging.LogQuery;
    
  2. 进行测试时,请记住第一次运行通常是最慢的,因为服务器必须实际完成工作,但在后续运行中,它通常使用缓存数据。尝试连续2-3次运行测试,看看他们是否不能同时开始运行。

  3. 我不知道它是否生成相同的查询,但尝试使用其他形式(应该在功能上等同,但可能会提供更好的时间)

    var teste = serv.PA_ENSAIOS_UM.Count(ens=>ens.COD_IDENT_UNMET == "FBLDY3840");
    
  4. 我想知道您的版本是否从数据库中提取数据然后计算它。如果是这样,这个其他语法可能会将所有工作留在它所属的服务器上。但不确定,尤其是因为我还没有使用EF和Oracle,我也不知道它是否与SQL相同。