我们正在使用 EF6.1 和 dotConnect for Oracle。
尝试调试为什么我们的开发在其中一个客户服务器上表现不佳,我打开了 DatabaseLogger 拦截器功能以在 DB 中执行查询并尝试改进它们。我发现的一件事是,在某些查询中,在执行查询和关闭连接之间存在几秒钟的延迟。例如:
Connection opened at 17/06/2014 9:47:42 +02:00
SELECT
"top". (...)
FROM ( SELECT
"Project1". (...)
FROM ( SELECT
"Extent1". (...)
"Extent2". (...)
FROM (...)
WHERE (...)
) "Project1"
ORDER BY (...)
) "top"
WHERE ROWNUM <= 1
-- p__linq__0: '589' (Type = Int32, IsNullable = false)
-- Executing in 17/06/2014 9:47:43 +02:00
-- Completed in 288 ms with result: aj
Connection closed at 17/06/2014 9:47:51 +02:00
正如你所看到的,有很多秒的延迟。这个查询运行了很多次,但延迟并不是在每个实例中都出现,其他的只有 2 或 3 秒的延迟,而其他的则没有。
我真的不知道从哪里开始调查。它与 EF 或 dotConnect Oracle 有关吗?执行查询并关闭连接后完成什么工作?
编辑:这是我用来从数据库中检索信息的代码:
var users = db.USUARIO
.Where(x => x.COORDENADA.Any(c => c.LATITUD != 0 && c.LONGITUD != 0))
.OrderBy(x => x.NOMBRE).AsQueryable();
(...)
var list = users.ToList()
.Select(x => new
{
Usuario = x,
LastCoord = db.COORDENADA
.Include(c => c.TIPO)
.Where(c => c.USUARIOID == x.USUARIOID && c.LATITUD != 0 && c.LONGITUD != 0)
.OrderByDescending(c => c.FECHAHORAPDA)
.ThenBy(c => c.TIPO.RUTA).FirstOrDefault()
})
.Select(x => new ListItem
{
ID = x.LastCoord.COORDENADAID,
Marcadores = new List<COORDENADA>(new[] { x.LastCoord }),
Principal = x.Usuario.NOMBRE.ToTitleCase(),
Inferior1 = x.LastCoord.FECHAHORAPDA.ToString("dd/MM HH:mm"),
Color = x.LastCoord.TIPO.COLOR
});
db.COORDENADA... 是我之前公开的查询。