我将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行。
答案 0 :(得分: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-3次运行测试,看看他们是否不能同时开始运行。
我不知道它是否生成相同的查询,但尝试使用其他形式(应该在功能上等同,但可能会提供更好的时间)
var teste = serv.PA_ENSAIOS_UM.Count(ens=>ens.COD_IDENT_UNMET == "FBLDY3840");
我想知道您的版本是否从数据库中提取数据然后计算它。如果是这样,这个其他语法可能会将所有工作留在它所属的服务器上。但不确定,尤其是因为我还没有使用EF和Oracle,我也不知道它是否与SQL相同。