Ef Linq 查询超时,但在 SSMS 上相同查询不到 1 秒

2023-11-22

首先我尝试过ARITHABORT OFF在 SSMS 上仍然不到 1 秒。

我使用 EntityFrameWork:6.1.3 和 Azure Sql S1 层(我将尝试使用第 3 层,如果有变化,请通知您。)

我使用 EF Profiler 从 linq 获取生成的 sql。我查询了我共享的所有 linqs,它们在 SSMS 上都不到 1 秒。

我在审核日志表上有 300 万条记录。一位 ID 为 3 的客户拥有 170K 条记录,另一位 ID 为 35 的客户拥有 125 条记录。我将最小化代码。

审计日志模型:

 public class AuditLog
  {
    public long? CustomerId { get; set; }

    [ForeignKey("CustomerId")]
    public virtual CustomerSummary Customer { get; set; }

    [Required]
    [Index]
     public DateTime CreatedDate { get; set; }
  }

第一个查询:

 if (customer != null)
    {
      var customerId = customer.Id;
      var result= Dbset.Where(x => x.CustomerId == customerId).OrderByDescending(x => x.CreatedDate).Skip(0).Take(25).ToList();
    }

如果我尝试使用拥有 170k 行的客户,则会出现超时异常。如果我尝试与有 125 条记录的客户合作,那就没问题。

第二次查询:与第一个相同,我只包含客户。

if (customer != null)
   {
      var customerId = customer.Id;
      var result= Dbset.Where(x => x.CustomerId == customerId).OrderByDescending(x => x.CreatedDate).Skip(0).Take(25).Include(x => x.Customer).ToList();
    }

结果与第一个查询相反。如果我尝试与拥有 170k 行的客户合作,那就没问题。如果我尝试使用拥有 125 条记录的客户,则会出现超时异常。

第三次查询:与第一个查询相同,但我匹配long?关于 customerId 的位置。

 if (customer != null)
    {
      long? customerId = customer.Id;
      var result= Dbset.Where(x => x.CustomerId == customerId).OrderByDescending(x => x.CreatedDate).Skip(0).Take(25).ToList();
    }

结果与第一个查询相反。如果我尝试与拥有 170k 行的客户合作,那就没问题。如果我尝试使用拥有 125 条记录的客户,则会出现超时异常。

第四次查询:与第二个查询相同,但我匹配long?关于 customerId 的位置。

 if (customer != null)
    {
      long? customerId = customer.Id;
      var result= Dbset.Where(x => x.CustomerId == customerId).OrderByDescending(x => x.CreatedDate).Skip(0).Take(25).Include(x => x.Customer).ToList();
    }

结果与第二个查询相反。如果我尝试使用拥有 170k 行的客户,则会出现超时异常。如果我尝试与有 125 条记录的客户合作,那就没问题。

我真的很困惑。为什么内连接或将匹配参数更改为long?结果正在改变吗?为什么所有查询在 SSMS 上运行不到 1 秒并在 ef linq 上给出错误?

Error:

{System.Data.SqlClient.SqlException(0x80131904):超时已过期。 操作完成之前超时时间已过或 服务器没有响应。 ---> System.ComponentModel.Win32Exception (0x80004005):等待操作超时 System.Data.SqlClient.SqlConnection.OnError(SqlException异常, 布尔值breakConnection,Action`1wrapCloseInAction)

更新(19/04/2016):

After 伊万·斯托耶夫对评论提出建议。

您是否尝试过(只是为了测试)使用硬编码 3 和 35 而不是customerId多变的?

我没有收到任何错误,并且查询速度与 SSMS 上一样最快。

更新(20/04/2016):真正的问题是参数嗅探。当我包含或更改参数为可为空时,实际上我创建了另一个查询和另一个查询计划。我为拥有 125 条记录的客户创建了一些计划,为拥有这 4 个查询的 170k 记录的客户创建了其他计划。这就是为什么我得到不同的结果。


你所经历的是所谓的结果参数嗅探问题。到目前为止,我不知道一个简单的通用解决方案,因此通常会建议一种解决方法,通过手动绑定表达式内的常量值来消除一些 SQL 查询参数,例如EntityFramework LINQ 查询计数失败,但查询返回结果。如何优化LINQ查询?.

对于您的场景,我建议使用以下自定义扩展方法:

public static class QueryableExtensions
{
    public static IQueryable<T> WhereEquals<T, TValue>(this IQueryable<T> source, Expression<Func<T, TValue>> selector, TValue value)
    {
        var predicate = Expression.Lambda<Func<T, bool>>(
            Expression.Equal(selector.Body, Expression.Constant(value)),
            selector.Parameters);
        return source.Where(predicate);
    }
}

然后像这样更新你的代码片段

if (customer != null)
{
    var result= Dbset.WhereEquals(x => x.CustomerId.Value, customer.Id)
        .OrderByDescending(x => x.CreatedDate)
        .Skip(0).Take(25)
        .Include(x => x.Customer)
        .ToList();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ef Linq 查询超时,但在 SSMS 上相同查询不到 1 秒 的相关文章

  • Poco c++Net:Http 从响应中获取标头

    我使用 POCO C Net 库进行 http 我想尝试制定持久缓存策略 首先 我认为我需要从缓存标头中获取过期时间 并与缓存值进行交叉检查 如果我错了 请告诉我 那么我如何从中提取缓存头httpResponse 我已经看到你可以用 Jav
  • 有没有办法在 xcode 上使用 c++0x ?我想使用 gcc 4.4 或更高版本

    我想使用 gcc 4 4 或更高版本进行 iphone 开发 有人知道怎么做吗 不 你不知道 相信我 你不会 Apple 仍保留 gcc 4 2 1 因为 4 2 2 及更高版本使用 GPLv3 这意味着他们必须放弃对其平台的控制 对于 i
  • 将完整模板参数值映射到原始类型

    我想将数字映射到类型 在这个例子中 我将创建一个函数 将 sizeof 结果映射到有符号的原始类型 我想知道是否有更好的方法来完成我在现代 C 中所做的事情 即采用模板化值并将其转换为类型 现在 这可以将大小转换为已知类型 但我似乎无法在标
  • CSharpRepl emacs 集成?

    我碰巧知道莫诺CSharpRepl http www mono project com CsharpRepl 是否有 emacs csharp 模式使用它在一个窗口中运行 REPL 并像 python 模式一样在另一个窗口中编译 运行 C
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • 计算另一个表达式中的 C# 表达式

    我想在另一个表达式中使用一个表达式 Expression
  • 一元 +/- 运算符如何可能导致“-a”或“+a”中的整数提升,“a”是算术数据类型常量/变量?

    这句看似微不足道的台词摘自我的迈克 巴纳汉和布雷迪的 C 书 第 2 8 8 2 节 http publications gbdirect co uk c book chapter2 expressions and arithmetic h
  • 增强精神、递归和堆栈溢出

    为什么下面的代码在运行时崩溃 它会给出堆栈溢出错误 include
  • UI 函数在快速事件完成之前触发

    我有一个停靠在 Silverlight 应用程序中的 Web 浏览器框架 有时会在其上弹出全窗口 XAML Silverlight UI 元素 我已经或多或少修复了一个老问题 即 Web 框架的内容似乎与 Silverlight 内容不能很
  • 析构函数中的异步操作

    尝试在类析构函数中运行异步操作失败 这是代码 public class Executor public static void Main var c1 new Class1 c1 DoSomething public class Class
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • 在 OpenGL 中渲染纹理 1 到 1

    所以我想做的是使用 OpenGL 和 C 将纹理渲染到平面上 作为显示图像的一种方式 但是我需要确保在渲染纹理时没有对纹理进行任何处理 抗锯齿 插值 平滑 模糊等 这是 OpenGL 处理渲染纹理的默认方式吗 或者是否需要设置一些标志才能禁
  • 最佳实践 - 存储过程日志记录

    如果您有一个长时间运行的 SP 您会以某种方式记录其操作还是只是等待此消息 命令成功完成 我认为 关于这个主题可以有很多解决方案 但是有没有最佳实践 一个经常使用的简单解决方案 EDIT 我发现了一个关于这个主题的有趣链接 http web
  • 选择查询不适用于使用Parameters.AddWithValue 的参数

    C 中的以下查询不起作用 但我看不出问题所在 string Getquery select from user tbl where emp id emp id and birthdate birthdate cmdR Parameters
  • CUDA 8 编译错误 -std=gnu++11

    我正在尝试转换一些代码以使用 CUDA 并且我认为我遇到了兼容性问题 我们使用CMake 这些是我使用的 gcc 和 CUDA 版本 gcc version gcc Ubuntu 5 4 0 6ubuntu1 16 04 5 5 4 0 2
  • 如何调试 .NET 运行时中的内部错误?

    我正在尝试调试一些处理大文件的工作 代码本身works 但 NET 运行时本身会报告零星错误 对于上下文 这里的处理是一个 1 5GB 文件 仅加载到内存中一次 在循环中处理和释放 故意尝试重现此否则不可预测的错误 我的测试片段基本上是 t
  • 需要提取字符串中点后的最后一个数字,如“7.8.9.1.5.1.100”

    我需要提取 C 字符串中最后一个点后面的最后一个数字 例如 7 8 9 1 5 1 100 并将其存储在整数中 Added 该字符串也可以是 7 8 9 1 5 1 1 或 7 8 9 1 5 1 0 我还想验证它在最后一个点之前恰好是 7
  • 使用 using 声明时,非限定名称查找如何工作?

    根据 C 标准 这是格式错误还是格式良好 namespace M struct i namespace N static int i 1 using M i using N i int main sizeof i Clang 拒绝它 GCC
  • 如何使用placement new重新初始化该字段?

    我的课程包含字段 private OrderUpdate curOrderUpdate 我一遍又一遍地使用它 经常需要重新初始化 for int i 0 i lt entries size i auto entry entries i ne
  • 在 Navicat Premium 中连接到 LocalDB 服务器

    Recently I installed LocalDb Serer on my laptop I am trying to establish a connection between Navicat and LocalDB server

随机推荐

  • 使用循环引用深度复制 Java 对象

    我将如何实施深度复制Foo 它包含一个实例Bar 然后引用该Foo public class Foo Bar bar Foo bar new Bar this Foo Foo oldFoo bar new Bar oldFoo bar pu
  • S3:如何授予多个桶的访问权限?

    我有一个允许访问 1 个存储桶的策略 Version 2012 10 17 Statement Effect Allow Action s3 ListBucket s3 GetBucketLocation Resource arn aws
  • 更改 UITabBar 高度

    I use UITabBarController作为根视图和应用程序支持 iOS 6 及更高版本 项目类层次结构如下 UITabBarController tab1 UINavigationController UIViewControll
  • 该代码如何反转数字中的位?

    unsigned reverse bits unsigned input works on 32 bit machine input input 0x55555555 lt lt 1 input 0xAAAAAAAA gt gt 1 inp
  • 从 QTextEdit 中删除一行/块

    我正在努力删除块 线QTextEdit 下面的代码应该 工作 但由于某些我未知的原因 它最终陷入无限循环 我怀疑next and previous 如果QTextDocument正在编辑中 QTextBlock block document
  • 如何使用 pip 下载可用的 Windows 二进制文件以及其他所有内容的源代码

    我必须管理两个独立的 Python 设置 一个位于具有互联网连接的 Linux 计算机上 另一个位于离线 Windows 计算机上 对于给定的一组所需软件包 我想在 Linux 计算机上下载必要的文件 将它们传输到 Windows 计算机并
  • Unity 中的物理对象在低速时无法正确弹跳

    我遇到一个问题 当启用物理功能的球缓慢移动时 它无法正确地从物体上弹开 我做了一个视频来说明问题 https youtu be 9T1hkir7sCo 基本上 球应该撞到静止的球 静止的球应该弹开 当速度足够快时 这种方法有效 但低于阈值时
  • 计算 .NET 中目录大小的最佳方法是什么?

    我编写了以下例程来手动遍历目录并在 C NET 中计算其大小 protected static float CalculateFolderSize string folder float folderSize 0 0f try Checks
  • 如果键盘出现,请将 Android 视图保持在可见区域

    我创建了一个简单的登录屏幕 其中从底部垂直堆叠了一个登录按钮 用户名和密码编辑框 当有人单击用户名 密码字段时 虚拟键盘会出现并隐藏其下方的编辑框或按钮 我在另一个应用程序中看到登录按钮始终保持在可见区域 我该如何实现这一点 In your
  • heroku 连接关闭代码=H13

    我在heroku上部署一个简单的nodejs服务器 并使用ssl有效证书 var https require https var express require express var bodyParser require body par
  • 英国邮政编码正则表达式[重复]

    这个问题在这里已经有答案了 我希望能够验证英国邮政编码 理想情况下 我希望以下情况能够通过 W1 W12 WC1 WC1A WC12 W1 6BT W12 6BT WC1 6BT WC1A 6BT WC12 6BT W16BT W126BT
  • python:结合排序键函数 itemgetter 和 str.lower

    我想按字典键对字典列表进行排序 但我不想区分大小写字符 dict1 name peter phone 12355 dict2 name Paul phone 545435 dict3 name klaus phone 55345 dict4
  • useState 挂钩的 setState 函数的类型?

    我正在将我的 React 项目转换为 Typescript 我有这样的状态 AdminBlogPostContainer tsx const blogPost setBlogPost useState
  • 在运算符重载中使用可变参数模板是否合法?

    我希望能够写一些这样的东西 struct bar template
  • 终止 postgresql 会话/连接

    如何终止所有 postgresql 连接 我正在尝试一个rake db drop但我得到 ERROR database database name is being accessed by other users DETAIL There
  • 如何通过 MockMvc 使用构造函数注入来测试控制器

    我有一个带有构造函数注入的控制器 RestController RequestMapping user public class MainController private final UserMapper userMapper auto
  • 读取 HTML 对象标签中的数据

    我有一个存储在服务器上的文本文件和一个 HTML 格式的对象 如下所示 我怎样才能阅读内容test txt在 JavaScript 中 到目前为止我所拥有的是 var data document getElementByID data 但我
  • 如何实现单实例Java应用程序?

    有时我看到许多应用程序 例如 msn Windows Media Player 等 它们都是单实例应用程序 当用户在应用程序运行时执行时 不会创建新的应用程序实例 在 C 中 我使用Mutex类 但我不知道如何在 Java 中执行此操作 我
  • 信封上邮票的最大值

    邮票问题是一个数学谜语 它询问如果信件只能容纳有限数量的邮票 并且这些邮票可能只有某些指定的面值 那么不能放在信封上的最小邮资价值是多少 例如 假设信封只能容纳三张邮票 可用的邮票面值为 1 美分 2 美分 5 美分和 20 美分 那么解就
  • Ef Linq 查询超时,但在 SSMS 上相同查询不到 1 秒

    首先我尝试过ARITHABORT OFF在 SSMS 上仍然不到 1 秒 我使用 EntityFrameWork 6 1 3 和 Azure Sql S1 层 我将尝试使用第 3 层 如果有变化 请通知您 我使用 EF Profiler 从