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 秒 的相关文章

  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 实体框架 - 选择特定列并返回强类型而不丢失强制类型转换

    我正在尝试做类似的事情这个帖子 https stackoverflow com questions 1094931 linq to sql how to select specific columns and return strongly
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • Spring Boot MSSQL Kerberos 身份验证

    目前在我的春季靴子中application properties文件中 我指定以下行来连接到 MSSql 服务器 spring datasource url jdbc sqlserver localhost databaseName spr
  • 如何在种子实体框架版本 6.x 中通过 AddOrUpdate 方法插入身份[重复]

    这个问题在这里已经有答案了 我有一个具有身份列的实体 作为数据种子的一部分 我想对系统中的 标准数据 使用特定的标识符值 我不想禁用身份 只有我想在迁移种子中设置 IDENTITY INSERT ON 我的代码是 protected ove
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 使用循环引用深度复制 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 从