使用数据库游标有什么好处?

2024-04-22

这是基于我面临的面试问题。

非常短的定义可以是

它可用于操作行 由查询返回。

除了使用光标之外(列出了点here http://msdn.microsoft.com/en-us/library/ms191179.aspx在MSDN上),我心中有一个问题,如果我们可以使用查询或存储过程执行所有操作(如果我没有错的话,就像我们可以使用Transact-SQL for ms-sql),有什么具体的点我们应该使用光标吗?


与大型结果集相比,使用光标就像使用视频流而不是一次性下载视频,然后在下载后观看它。 如果你下载,你必须有几GB的空间和耐心等待下载完成。现在,无论您的机器或网络有多快,每个人都以相同的速度观看电影。

通常,任何查询都会发送到服务器并执行,然后通过网络将结果集发送给您,这是一次突发的活动。 游标将使您可以逐行访问数据,并且仅在您请求时(实际上可以查看它)流式传输每一行。

  • 光标可以节省您的时间 - 因为您无需等待完整记录集的处理和下载
  • 它将节省服务器和客户端上的内存,因为它们不必将大量内存专用于结果集
  • 平衡您的网络和服务器的负载 - 在“突发”模式下工作通常效率更高,但它可能会完全阻塞您的服务器和网络。对于多用户环境来说,这样的延迟是很少需要的。流式传输为其他操作留下了空间。
  • 允许对查询表(在某些条件下)进行不直接影响游标的操作。因此,当您将光标放在一行上时,其他进程可以读取、更新甚至删除其他行。这对于非常繁忙的表、许多并发读取和写入尤其有帮助。

然而,这给我们带来了一些警告:

  • 一致性:使用游标,您(通常)不会对数据的一致快照进行操作,而是对一行进行操作。因此,您的并发性/一致性/隔离性保证从整个数据库(ACID)下降到只有一行。您通常可以告知 DBMS 您想要什么级别的并发性,但如果您太挑剔(锁定您所在的整个表),您将浪费服务器端节省的许多资源。

  • 单独传输每一行可能效率非常低,因为每个数据包都有协商开销,您可以通过为每个数据包发送大的(可能是压缩的)数据块来避免协商开销。 (没有数据库服务器或客户端库愚蠢到单独传输每一行,两端都有缓存和分块,但它仍然是相关的。)

  • 游标更难正确使用。考虑一个具有大结果集的查询,促使您使用游标,该游标使用带有聚合函数的 GROUP BY 子句。 (此类查询在数据仓库中很常见)。 GROUP BY 可以完全破坏您的服务器,因为它必须立即生成并存储整个结果集,甚至可能持有其他表的锁。

经验法则:

  • 如果您处理快速创建的小型结果集,请不要使用游标。
  • 游标擅长于即席、复杂(参考)、具有大结果集和低一致性要求的顺序查询。

“顺序性质”意味着查询中的大量 GROUP BY 子句中没有聚合函数。服务器可以懒洋洋地决定计算 10 行供游标从缓存中使用,并同时执行其他操作。

HTH

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

使用数据库游标有什么好处? 的相关文章

随机推荐

  • 如何手动删除类的实例?

    如何手动删除类的实例 Example include
  • AngularJS toArray 将对象键转换为数字

    我在项目中使用角度过滤器按页面对输出对象进行排序 问题是当我使用如下语法时 ul class catalog list key li dziecko rodzina b dziecko page b li ul
  • JAXB 将 XML 元素解组到 HashMap

    我发现很多文章描述了如何将 XML 元素序列解组到 HashMap 只要它们位于 父 元素内 但是 我无法将此与直接在根元素下的子元素一起使用 选项 1 有效
  • 如何在 C# 中将 Enter 按键解释为 Tab

    我最近刚刚开始 C 开发 当时我正在开发一个基于表单的项目 我试图在用户位于表单上并按下 Enter 键时执行 制表符 操作 我知道答案可能很简单 但我是这个领域的新手 欢迎来到 SO Tex 我相信有两种方法可以实现这一点 只需添加 选项
  • 移动光标位置?

    使用下面的代码 我想将屏幕上的光标移动到点 200 200 效果很好 但是当我 用手 移动鼠标时 光标立即返回到其原始位置 我究竟做错了什么 我在跑步XP on a KVM虚拟机运行在linux主机 这并不影响该程序的运行方式 我还尝试了各
  • 代理 golang https

    我正在努力让一个人进来https www google com https www google com使用带有身份验证的代理 我已经传递了标头参数 代理授权 但代理服务器返回 需要代理身份验证 code package main impo
  • Paper-fab 部分隐藏在应用程序工具栏后面

    我想导入一个包含paper fab并拥有paper fab重叠之间的接缝app header元素和导入的元素 在本例中 我将导入的元素称为fab element 换句话说 我只是想要paper fab 漂浮 正如广告所言 就像它应该的那样
  • Android 邮件发送验证

    我使用下面的代码将电子邮件发送到可能的电子邮件地址 当我单击 发送 按钮时 有一条 toast 消息显示 消息发送 但我的代码中没有它 它必须是默认的 我的问题是 这表示消息将被发送 但没有说明消息已发送 我知道无法检查它是否到达 但应该有
  • 将 webpack 应用于全栈节点应用程序最合理的方式是什么?

    我已经研究 webpack 几个星期了 我已经看到了很多前端设置的例子 可能只是这是后端的设置 http jlongster com Backend Apps with Webpack Part I 我正在尝试设置一个带有节点后端 例如ex
  • 从android中的drawable文件夹中随机生成图像

    安卓版本 4 2我正在开发一个安卓应用程序 我需要从可绘制文件夹中随机生成图像 在我的绘图中 我有 45 张具有不同名称的图像 我的xml代码是
  • 在 C 中使用 Go 切片

    我正在尝试构建一个带有返回切片的函数的 go 共享库 如何使用 C 代码中的切片 package main import C type T struct A C int B C char export Test func Test T ar
  • Active Directory“-approx”过滤器运算符如何工作?

    查看 AD Cmdlet 时 Filter今天早些时候 我遇到了一个我以前从未见过的操作员 approx 我可以在几个博客和一些 TechNet 文章中找到提到此运算符 但我没有找到任何解释此运算符的用途的信息 除了 大约等于 的使用定义之
  • 如何使用 Node.js 按需解析记录?

    是否有一个 Node 模块可以从 CSV 文件中解析特定数量的记录 用例是解析大型日志文件并根据请求将记录传送到分页客户端 node csv https github com wdavidw node csv can t yet https
  • 设置持续时间格式,如 HH:mm:ss

    有没有一种好方法可以将持续时间格式化为 hh mm ss 之类的格式 而不必处理时区 我试过这个 DateTime durationDate DateTime fromMillisecondsSinceEpoch 0 String dura
  • NET40-RequiresCastle 和 NET40 版本的 Moq 有什么区别?

    在moq的发行版中 有两个版本 NET40 RequiresCastle和NET40 NET40 RequiresCastle 看起来比 NET40 小得多 但在运行时需要 Castle 区别只是因为 Castle 嵌入在 NET40 版本
  • 带有连字符的 ActionLink htmlAttributes

    这有效 a href Url Action class ui btn right Edit a 但这不是 为什么 Html ActionLink Edit edit markets new id 1 new class ui btn rig
  • 在netbeans中使用视觉摆动JPopupmenu

    我想向我的应用程序添加一个弹出菜单 但是当我将它添加到我的面板时 我看到它消失了 我如何像其他菜单一样直观地编辑 jpopup 菜单 我认为您正在谈论在 NetBeans 中使用 matisse 视觉设计器 在这种情况下 该过程与创建只需将
  • 如何使用命名空间从 XML 中“选择”?

    我有一个类似 的 XML 文档
  • setattr 和 getattr 方法

    我有一个锅炉板类 它将一些操作委托给参考类 它看起来像这样 class MyClass def init self someClass self refClass someClass def action1 self self refCla
  • 使用数据库游标有什么好处?

    这是基于我面临的面试问题 非常短的定义可以是 它可用于操作行 由查询返回 除了使用光标之外 列出了点here http msdn microsoft com en us library ms191179 aspx在MSDN上 我心中有一个问