实体的框架Arithabort在,但仍可查询是缓慢的

0

的问题

我有一个简单的查询

var count =  await _context.ExchangeRate.AsNoTracking().CountAsync(u => u.Currency == "GBP");

本表只有3列和10排的数据。

当我试图执行的查询的网5个项目是把周围2.3秒的第一次和500毫秒(+-100)进行后续请求。 当我打了相同要求在短程也是回来几乎没有时间(45ms如sql profiler).

我已经实现ARITHABORT中的EF从 这里

当我看到在SQL Profiler这是设置ARITHABORT,但仍然的查询需要的同时为第一个请求和后续请求。

sql profiler screen shot

我如何实现同样的速度作为短程查询的速度。 我需要查询的运行真正的速度作为我的项目的要求的回应在1第二(需要至少5个简单的DB电话...如果1呼吁采取500毫秒后它是交叉1第二项要求)

编辑

尝试连ADO.Net. 执行时间了如SQL Profiler是40毫秒其作为当它达到了代码这几乎是400毫秒. 这么多的区别

        using (var conn = new SqlConnection(connectionString))
        {
            var sql = "select count(ExchangeRate) as cnt from ExchangeRate  where Currency = 'GBP'";

            SqlCommand cmd = new SqlCommand();

            cmd.CommandText = "SET ARITHABORT ON; " + sql;
            cmd.CommandType = CommandType.Text;
            cmd.Connection = conn;
            conn.Open();
            var t1 = DateTime.Now;
            var rd =  cmd.ExecuteReader();
            var t2 = DateTime.Now;
            TimeSpan diff = t2 - t1;

           Console.WriteLine((int)diff.TotalMilliseconds);
          
          while (rd.Read())
          {
               Console.WriteLine(rd["cnt"].ToString());
          }
            conn.Close();
        }
1

最好的答案

0

你的"第一行"的情况通常是一个静态的初始化的代码的第. 这是这里的代码的第作出其映射的第一次及时会发生第一个查询执行。 典型的做法,以避免发生这种情况对于一个用户有一个简单的"热"的查询时运行服务开始。例如后你的业务初始化,简单地把喜欢的东西如下:

// Warm up the DbContext
using (var context = new AppDbContext())
{
    var hasUser = context.Users.Any();
}

这种也作为一个快速启动检查数据库是访问和响应。 查询本身将做一个很快的操作,但该代码的第解决其映在这段时间所以,任何新产生的代码的第情况将作出回应,而不会产生成本,在一个请求。

作为原料的性能,如果它不是一个查询,预计需要一段时间,占用一请求, 让它 async. 异步请求是 快,它们实际上是一位速度较慢。 使用 async 请求对代码的第约,确保您的网络服务器/应用程序线是响应,同时可能很昂贵数据库操作的处理。 如果你想要一个响应尽可能快地,使用一个同步的呼吁。

接下来,确保任何领域筛选的反对,在这种情况下货币、编制索引。 有一个领域被称为货币在你的实体作为一串而不是一个CurrencyId FK(int)指向一种货币记录已经是一个额外的索引编制费用作为索引的整数较小/较快于那些关于字符串。

你也不需要费心 AsNoTracking 当使用 Count 查询。 AsNoTracking 仅适用于当你回实体(ToList/ToArray/Single/First等等)。 为了避免具有代码的第持一个参考来返回的实体。 当你使用 Count/Any 或突返回性质的实体使用 Select 没有实体返回到轨道。

还考虑网络之间的延迟您的应用程序的运行代码和数据库服务器。 是他们相同的机或是有一个网络连接在玩? 这是如何进行比较的时候您正在执行一个短程的查询? 使用探查你可以看到什么SQL EF是实际发送的数据库。 其他一切在时间上是一种成本:得到的请求数据库,获取所得数据的背面给请求者,析,响应。 (如果的情况下返回的实体,分配,填充,检查对现有参考文献,等等...在的情况下计数等。 检查现有的引用)

最后,为了确保你得到的最高性能,确保您的DbContexts寿命是保持简短。 如果一个代码的第保持开放,并已有许多跟踪运行查询反对(选择实体没有 AsNoTracking)跟踪这些实体引用积累并能有负面的性能产生影响今后的查询,甚至如果你使用 AsNoTracking 作为EF看到检查,通过它的跟踪的参考文件的实体可能适用的/有关的新的查询。 很多次我看到开发商承担DbContexts是"贵"所以他们选择的实例,他们尽可能避免这些费用,只要最终使得行动更加昂贵。

与所有的考虑,EF将永远不会 一样快 为原SQL。 这是一个奥姆的设计提供便利。网的应用,当它涉及到与工作的数据。 即便在工作与实体类别而不是卫生和写作自己的原SQL每一次附带成本。

2021-11-23 21:59:24

尽你的意见有关网络延迟两短程和网的代码是我的机器。。数据库在服务器...和其他的东西我只有一个查询(这是一个POC)。 因此,与相同的网络延迟短程能够取在40毫秒其作为净码是500毫秒.....甚至尝试ADO.NET 看到在这个问题,两者都是把500毫秒
CrazyMonk

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................