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

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(使用前将#替换为@)

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

  • 尝试通过比较不同的表从 SQL 查询输出正确的值

    我对 SQL 非常陌生 需要有关如何使用正确的查询完成此任务的帮助 我有 2 张桌子需要使用 表 TB1 有 id Name 1 bob 2 blow 3 joe 表 TB2 有 compid property 1 bob 2 blow 我
  • 术语 SSTable 和 LSM Tree 之间有什么区别

    这两个术语可以互换使用吗 我读过有关 SSTable 工作原理的文章 通常文章都会开始提到 LSM Tree 然而 它们似乎是同一件事 我什么时候应该使用一个术语而不是另一个术语 对于凡人来说 SSTables 和 LSM Trees 的最
  • SQL/C# - UPSERT 上的主键错误

    UPDATE 简化的问题 从问题中删除了 C 在以下情况下 如何编写一个可以识别两行相同的 UPSERT 看看怎么有一个 b 退格键 在那里编码 奇怪的小字符 SQL 将它们视为相同 虽然我的 UPSERT 将此视为new data并在应该
  • 显式与隐式 SQL 连接

    显式内连接与隐式内连接之间有效率差异吗 例如 SELECT FROM table a INNER JOIN table b ON a id b id vs SELECT a b FROM table a table b WHERE a id
  • 有很多数据库视图可以吗?

    我很少 每月 每季度 使用 Microsoft SQL Server 2005 数据库视图生成数百份 Crystal Reports 报告 在我不读取这些视图的所有时间里 这些视图是否会浪费 CPU 周期和 RAM 因为我很少从视图中读取数
  • 实体框架 - 查询可为空列时出现问题

    我在从具有可为空的tinyint 列的表中查询数据时遇到问题 问题似乎是查询生成为 AND CAST Extent1 PositionEffect AS int p linq 3 gt p linq 3 NULL 如果我手动运行该查询 它不
  • mysql 在 sum() 函数上使用 concat,例如 concat(sum(col1),"%")

    我正在尝试合并多个查询 但其中一个查询使用 sum 当我尝试在此列上应用 concat 时 我得到不需要的 blob 结果 我如何在聚合列上应用 concat 和 union 我期待这个结果 SELECT row 1 col1 UNION
  • Drupal 视图 - 自定义/修改 SQL

    我遇到了 配置文件复选框 模块的问题 该模块存储以逗号分隔的自定义配置文件字段 问题是我是否创建一个视图来按值过滤 SQL 结果最终是这样的 AND profile values profile interests value in Bus
  • PostgreSQL:有效地将 JSON 数组拆分为行

    我有一个表 表 A 其中包含一个包含 JSON 编码数据的文本列 JSON 数据始终是一个包含一到几千个普通对象的数组 我有另一个表 表 B 其中有几列 包括数据类型为 JSON 的列 我想从表 A 中选择所有行 将 json 数组拆分为其
  • 按每月时间为用户标记标签

    数据源 User ID Visit Date 1 2020 01 01 12 29 15 1 2020 01 02 12 30 11 1 2020 04 01 12 31 01 2 2020 05 01 12 31 14 Problem 我
  • 表达与空列表相同的 IN 条件的可移植方式是什么?

    例如 工作于sqllite3 select from orders where custid and status in 但它失败了postgres ksysdb select code applicable objecttype from
  • 无法删除数据库 mysql:错误 3664 (HY000)

    我的应用程序中有一个名为X Files 我想要drop它 但每当我运行命令时drop database X Files我收到以下错误 mysql gt drop database X Files ERROR 3664 HY000 Faile
  • 显示一个表中的所有记录以及另一表中的匹配记录

    您好 我有一张下表 其中记录了活动和积分 Activites A ID Site ActivityValue ActivityName 1 site1 7 ActivityName1 2 site1 6 ActivityName2 2 si
  • 日志中每天的每周活跃用户数

    我想知道是否有人可以帮助我使用一些 SQL 来返回两天或更长时间内登录到数据库表的唯一用户数量 让我们使用 7 天作为参考 我的日志表在每一行中包含时间戳 ts 和 user id 表示该用户当时的活动 以下查询返回此日志中的每日活跃用户数
  • MySQL 跨表计数(*) 查询帮助

    SELECT name COUNT AS count FROM t1 t2 WHERE t2 id t1 id GROUP BY t2 id 我想从 t1 获取名称以及 t2 中 id 与 t1 相同的行数 到目前为止我已经得到了上面的内容
  • 有没有办法在插入查询中执行另一个查询?

    好的 这是我的查询 我刚刚添加了 ACCOUNTID 和 accountID 部分 这显然不起作用 INSERT INTO Leads LEADID CREATEUSER CREATEDATE FIRSTNAME MODIFYDATE AC
  • 如何在 DataColumn.Expression 中使用 IF/ELSE 或 CASE?

    我有一个包含 1 列的表 状态 我想添加另一列名为 Action 的列 其值如下 如果 Status Yes 则 Action Go 否则 Action Stop 我使用以下代码添加到 操作 列中 但它不起作用 myDataTable Co
  • 如何在事务中使用链接服务器插入远程表?

    我的链接服务器设置正确 我能够执行以下查询 插入 远程服务器 表 SELECT FROM 本地服务器 表 然而当我做同样的事情时交易内 开始传输 插入 远程服务器 表 SELECT FROM 本地服务器 表 提交交易 我收到类似的错误 用于
  • 有没有办法在 MySQL 中有效地对 TRUNCATE 或 DROP TABLE 进行 GRANT ?

    我最近在 MySQL 5 5 x 中尝试过 GRANT SELECT INSERT UPDATE DELETE TRUNCATE ON crawler TO my user localhost WITH GRANT OPTION 这会导致错
  • 计算包含字母/数字的行数

    我想要实现的目标很简单 但是解释起来有点困难 我不知道在 postgres 中这是否真的可能 我处于相当基础的水平 SELECT FROM WHERE LEFT JOIN ON HAVING 等等基本的东西 我正在尝试计算包含特定字母 数字

随机推荐

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

    如何手动删除类的实例 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上 我心中有一个问