使用 Skip/Take 进行分页时 LINQ 查询性能极差

2024-01-11

我需要使用 LINQ 从 DB2 数据库查询记录。我有从数据库架构生成的实体,并尝试使用 Skip 和 Take 执行 LINQ 查询。基础表大约有 25 列,可能有 100 万条记录。当我在没有“Skip()”的情况下执行查询时,大约需要 0.508 毫秒才能完成。当我包含 Skip() 时,需要将近 30 秒。巨大差距。

谁能告诉我为什么会发生这种情况?

UPDATE:这是我正在使用的 LINQ 查询。

var x = 30;

var results = context.ASSET_T
.OrderBy(c => c.ASSET_ID)
.Skip(x)
.Take(x)
.ToList();

UPDATE:所以我只是尝试更新查询,以便只返回单个列 ASSET_ID。当我只返回这一列时,使用 Skip() 的查询只需要 0.256 毫秒。

var x = 30;

var results = context.ASSET_T
.OrderBy(c => c.ASSET_ID)
.Skip(x)
.Take(x)
.Select(c => c.ASSET_ID)
.ToList();

如果我包含任何其他列,那么查询执行时间会增加戏剧性地.

例如,下面的查询需要 10 秒才能执行。

var x = 30;

var results = context.ASSET_T
.OrderBy(c => c.ASSET_ID)
.Skip(x)
.Take(x)
.Select(c => new {
                 ASSET_ID = c.ASSET_ID,
                 ASSET_TYP = c.ASSET_TYP
                 ASSET_DESC = c.ASSET_DESC
                 })
.ToList();

UPDATE:我现在发现我尝试查询的表中的列存在问题(可能与索引相关)。正如我上面提到的,当我执行仅返回 ASSET_ID 列的查询时,只需要 0.256 毫秒。如果我尝试执行一个查询ONLY返回 ASSET_DESC 或查询ONLY返回 ASSET_TYP 然后查询执行时间跳至 9 秒左右。

这是否表明其他列当前尚未建立索引?

UPDATE:我添加了上述 LINQ 查询的 SQL 输出。

SELECT 
Project1.C1 AS C1, 
Project1.ASSET_ID AS ASSET_ID, 
Project1.ASSET_TYP AS ASSET_TYP, 
Project1.ASSET_DESC AS ASSET_DESC
FROM ( SELECT Project1.ASSET_ID AS ASSET_ID, Project1.ASSET_TYP AS ASSET_TYP, Project1.ASSET_DESC AS ASSET_DESC, Project1.C1 AS C1, row_number() OVER (ORDER BY Project1.ASSET_ID ASC, Project1.ASSET_TYP ASC, Project1.ASSET_DESC ASC) AS row_number
  FROM ( SELECT 
    Extent1.ASSET_ID AS ASSET_ID, 
    Extent1.ASSET_TYP AS ASSET_TYP, 
    Extent1.ASSET_DESC AS ASSET_DESC, 
    CAST(1 AS int) AS C1
    FROM MYDB.ASSET_T AS Extent1
  )  AS Project1
)  AS Project1
WHERE Project1.row_number > 1
ORDER BY Project1.ASSET_ID ASC, Project1.ASSET_TYP ASC, Project1.ASSET_DESC ASC FETCH  FIRST 31 ROWS ONLY 

您是否查看过为此查询生成的 SQL?

据我所知 Skip() Take() 最终会生成一个使用名为 Row_Number() 的函数的生成语句。此函数以如下所示的方式在整个记录集中执行 - 在获取所需的开始值和结束值之间的值之前,将行号插入结果中作为第一个生成的列,这通常会使其在大型记录上变得非常非常慢套..

SELECT ...
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY [t0].[...]) AS [ROW_NUMBER], ... ,
    FROM [table] AS [t0]
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]

如果您可以使用索引数字列并对其进行排列,以便您自己读取 >= start_value AND

我有索引良好的数据库,其中有数百条记录,而 Skip().Take() 可能需要长达 30 分钟才能获取 25 条记录。直接读取where are大约需要20-40ms。

这意味着您必须考虑实现分页的编码方式,并且在您的情况下实现可能不切实际。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Skip/Take 进行分页时 LINQ 查询性能极差 的相关文章

  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • 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
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 如何连接字符串和常量字符?

    我需要将 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 列出了简单赋值的约束

随机推荐

  • PHP htaccess 将查询字符串从大写重定向到小写

    我有这个小的 php 脚本和 htaccess 中的几行 用于将带有查询字符串的 URL 从大写重定向到小写 但是 仅当 url 文件或 url 的目录部分中有大写字符时 它才会将查询字符串中的大写字符重定向为小写字符 大写目录示例 dom
  • Java Spring JMS:JmsTemplate 到 IBM MQ

    Update 这是我的错误 我忘记了 ssl 调试正在运行 它现在非常快并且像魔术一样工作 我有一个使用 Spring JMS 连接到 IBM MQ 的 Spring Boot 应用程序 我意识到与根本不使用 Spring 相比 jmsTe
  • sys.stdin.readline() 读取时没有提示,返回“两者之间没有任何内容”

    我有一个执行以下操作 除其他外 的函数 userinput stdin readline betAmount int userinput 应该从 stdin 获取输入整数作为字符串并将其转换为整数 然而 当我调用该函数时 它返回一个换行符
  • 为什么在 JavaScript 构造函数中使用副作用是不好的做法?

    我使用与设计模式非常相似的东西自定义对象 http www klauskomenda com code javascript programming patterns custom通常在我的代码中 但 JSLint 不赞成这样的构造 fun
  • 远程运行 Perl 脚本时使用 MsgBox 回显变量?

    这可能吗 我正在使用 VB net 执行远程 Perl 脚本 我希望屏幕上出现一个 MsgBox 类似于 VBScript 我尝试只执行 Win32 MsgBox Test 但这不起作用 有可能吗 我正在从 Windows 系统远程执行脚本
  • 计算两幅图像之间的模糊内核

    与标准 且更具挑战性 去模糊和超分辨率场景不同 我可以访问原始 清晰 图像G而且是模糊版本B 我只是在寻找模糊内核h 所以因为B使用真实相机拍摄 关系为 B G h N 在哪里 表示卷积和N是一些附加噪声 自然 这是一个过度约束的问题 因为
  • 正则表达式仅匹配不在括号或方括号中的逗号

    我想用不在括号或方括号中的逗号分隔字符串 我正在使用以下字符串 土豆 植物油 向日葵油 玉米油和 或菜籽油 蜂蜜 烧烤调味料 糖 盐 葡萄糖 圆酵母 洋葱粉 香料 麦芽糊精果糖 酵母提取物 糖蜜 天然香料 含牛奶 玉米淀粉 蜂蜜 阿拉伯胶
  • 直接用户输入的动态 LINQ 有什么危险吗?

    我在 ASP NET MVC 应用程序中有一个表 我希望可以使用 AJAX 对其进行排序 服务器端 和过滤 我希望它在其他地方相当容易使用 并且不想将排序和过滤硬编码到查询表达式中 因此我寻找一种动态构建表达式的方法 我发现最好的方法是使用
  • 如何将 CSS 变换矩阵转换回其组件属性

    我通过使用获得了元素的 CSS 变换矩阵getComputedStyle 方法如下 var style window getComputedStyle elem1 null var trans style transform 反式 矩阵 1
  • 使用 LINQ LAMBDA 获取每个部门的员工

    我正在尝试使用 LINQ 连接两个表员工和部门 并尝试获取下面给出的图像格式的结果 有人可以帮助如何实现这一目标吗 如何实现每个部门的员工 这是我的代码 var EmpList from d in Department join e in
  • 初始加载后取消选择列表框中的所有项目

    我有一个列表框 最初显示时选择了第一个项目 我希望它显示时未选择任何项目 这可能吗 ListBox ClearSelected or ListBox SelectedIndex 1 当然 它们是成员方法
  • 导航栏下方的空白区域

    When self navigationController navigationBar translucent NO 导航栏下方出现空白 如下所示 我怎样才能删除它 From above example void loadUI self
  • 找不到模块 ember-validations

    尝试使用 ember cli 的 ember validations 插件 遇到这个问题 我不知道缺少什么 这是我的 package json 中的依赖项部分 devDependencies broccoli asset rev 2 0 0
  • 未找到 Xamarin 方法“CGSize..ctor”

    我刚刚更新了 xamarin studio 然后更新了我的 iOS 项目中的 xamarin forms 包 一切都构建得很好 但是当我尝试在模拟器中运行该应用程序时 出现以下错误 未找到方法 CGSize ctor 我创建了一个新的解决方
  • Laravel Blade 表单关闭问题

    我在 Laravel 中有一个这样的表单 div class modal body Form model questionGroup route gt question groups update questionGroup gt id m
  • 如何使用 uniqueId() jquery ui

    似乎 jquery ui 已加载 因为当我运行时 function did the UI load console log ui version JS控制台返回1 10 3 我正在使用宝石https github com joliss jq
  • Pandas 将 groupby 总和值分配给原始表中的最后一行

    例如 我有一张桌子 A id price sum 1 2 0 1 6 0 1 4 0 2 2 0 2 10 0 2 1 0 2 5 0 3 1 0 3 5 0 我想要的就像 最后一行sum应该是price一个团体的 id price sum
  • Asp.net 会员资格 - 帐户被锁定

    我们正在使用 ASP net 附带的标准 ASP net 会员功能 我们的会员数据库中的某些帐户将 锁定 标志设置为 true 这种情况何时 如何发生 在可配置的时间长度 passwordAttemptWindow 默认 10 分钟 内登录
  • JQuery FullCalendar 从 ajax 成功调用 rerenderEvents 时出现问题

    由于某种原因 我无法在 POST 后重新呈现日历 到那时一切都很顺利 calendar fullCalendar select function startDate endDate ajax url data php type POST d
  • 使用 Skip/Take 进行分页时 LINQ 查询性能极差

    我需要使用 LINQ 从 DB2 数据库查询记录 我有从数据库架构生成的实体 并尝试使用 Skip 和 Take 执行 LINQ 查询 基础表大约有 25 列 可能有 100 万条记录 当我在没有 Skip 的情况下执行查询时 大约需要 0