使用EF和Oracle选择Count very slow

使用EF和Oracle选择Count very slow,oracle,entity-framework,Oracle,Entity Framework,我正在使用EF5和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"

我正在使用EF5和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行。

以下是一些您可以尝试的内容:

  • 捕获正在生成的查询,并查看它是否与正在使用的查询相同。可以找到详细信息,但本质上,您将实例化
    DbContext
    (我们称之为“\u context”),然后将
    Database.Log
    属性设置为日志记录方法。如果这个方法实际上没有做任何事情,那也没关系——您可以在其中设置一个断点,然后看看发生了什么

    例如,定义一个日志函数(我有一个名为“logging”的静态类,它使用nLog写入文件)

    然后,当您创建上下文时,指向LogQuery:

    _context.Database.Log = Logging.LogQuery;
    
  • 在执行测试时,请记住,第一次运行通常是最慢的,因为服务器必须实际执行工作,但在后续运行中,它通常使用缓存数据。试着背靠背地运行测试2-3次,看看它们是否在同一时间开始运行

  • 我不知道它是否会生成相同的查询,但请尝试另一种形式(在功能上应该是等效的,但可能会提供更好的时间)


  • 我想知道您的版本是否从数据库中提取数据,然后进行计数。如果是这样的话,其他语法可能会将所有工作留在它所属的服务器上完成。不确定,尤其是因为我从未在Oracle中使用过EF,我不知道它的行为是否与SQL相同。

    EF生成的SQL查询是否相同?我只有在使用ToList()而不是Count()时才能获得查询。在本例中,查询是相同的,但在EF中,返回时间超过10秒。
    _context.Database.Log = Logging.LogQuery;
    
    var teste = serv.PA_ENSAIOS_UM.Count(ens=>ens.COD_IDENT_UNMET == "FBLDY3840");