在查询结束之前开始查看查询结果

2023-12-02

假设我查询一个包含 500K 行的表。我想开始查看获取缓冲区中保存结果集的任何行,即使查询尚未完成。我想滚动浏览提取缓冲区。如果我滚动得太远,我想显示一条消息,例如:“到达获取缓冲区的最后一行..查询尚未完成”。

  • 当查询继续构建结果集时,可以使用 fgets() 读取提取缓冲区来完成此操作吗?这样做意味着多线程*

除了 FIRST ROWS 提示指令之外,Oracle、Informix、MySQL 或其他 RDBMS 中是否可以提供这样的功能?

整个想法是能够在长查询完成之前开始查看行,同时显示可立即查看的行数的计数器。

编辑:我的建议可能需要对数据库服务器的体系结构进行根本性的改变,即它们处理内部获取缓冲区的方式,例如锁定结果集直到查询完成等。像我建议的那样的功能将非常有用,特别是对于需要很长时间才能完成的查询。为什么必须等到整个查询完成,此时您可以开始查看一些结果,同时查询继续收集更多结果!


释义:

我有一个包含 500K 行的表。没有良好索引支持的即席查询需要全表扫描。我想在全表扫描继续时立即查看返回的第一行。然后我想滚动浏览下一个结果。

看来您想要的是某种可以有两个(或更多)线程在工作的系统。一个线程将忙于从数据库同步获取数据,并向程序的其余部分报告其进度。另一个线程将处理显示。

同时,我想显示表扫描的进度,例如:“搜索...到目前为止已找到 500,000 行中的 23 行”。

目前尚不清楚您的查询是否会返回 500,000 行(事实上,我们希望它不会),尽管它可能必须扫描所有 500,000 行(并且到目前为止很可能只找到 23 行匹配)。确定要返回的行数很困难;确定要扫描的行数更容易;确定已扫描的行数非常困难。

如果我滚动得太远,我想显示一条消息,例如:“已到达前瞻缓冲区中的最后一行...查询尚未完成”。

因此,用户已滚动到第 23 行,但查询尚未完成。

这可以做到吗?也许像:spawn/exec、声明滚动光标、打开、获取等?

这里有几个问题。 DBMS(对于大多数数据库来说都是如此,当然对于 IDS 也是如此)在处理一条语句时仍然与当前连接相关。获得有关查询进展情况的反馈很困难。您可以查看查询启动时返回的估计行数(SQLCA 结构中的信息),但这些值很可能是错误的。当您到达 23 行中的第 200 行时,您必须决定要做什么,否则您只能到达 5,697 行中的第 23 行。有总比没有好,但并不可靠。确定查询进展到什么程度是非常困难的。并且有些查询需要实际的排序操作,这意味着很难预测需要多长时间,因为在排序完成之前没有可用的数据(并且一旦排序完成,只有之间进行通信所花费的时间) DBMS 和应用程序来阻止数据的传输)。

Informix 4GL 有很多优点,但线程支持并不是其中之一。该语言的设计并未考虑到线程安全,并且没有简单的方法可以将其改进到产品中。

我确实认为您所寻求的最容易由两个线程支持。在像 I4GL 程序这样的单线程程序中,在等待用户输入更多输入(例如“向下滚动下一个充满数据的页面”)时,没有一种简单的方法来获取行。

FIRST ROWS优化是对DBMS的一个提示;它可能会或可能不会给感知性能带来显着的好处。总的来说,这通常意味着从 DBMS 的角度来看,查询的处理不太理想,但快速向用户提供结果可能比 DBMS 上的工作负载更重要。


在下面某个被严重否决的答案中,弗兰克喊道(但请不要喊):

这正是我想要做的,生成一个新进程来开始显示first_rows并滚动它们,即使查询尚未完成。

好的。这里的困难是在两个客户端进程之间组织 IPC。如果两者都连接到 DBMS,则它们具有单独的连接,因此一个会话的临时表和游标对另一个会话不可用。

执行查询时,会创建一个临时表来保存当前列表的查询结果。 IDS 引擎是否会在此临时表上放置独占锁,直到查询完成?

并非所有查询都会生成临时表,尽管滚动游标的结果集通常确实具有与临时表大致相同的内容。 IDS 不需要在支持滚动游标的临时表上放置锁,因为只有 IDS 才能访问该表。如果它是常规临时表,则仍然不需要锁定它,因为除了创建它的会话之外,无法访问它。

我所说的 500k 行是指查询表中的 nrows,而不是返回多少预期结果。

也许更准确的状态消息是:

Searching 500,000 rows...found 23 matching rows so far

我知道可以在 sysmaster:sysactptnhdr.nrows 中获得准确的 nrows 计数?

大概;您还可以使用“SELECT COUNT(*) FROM TheTable”获得快速准确的计数;这不会扫描任何内容,而只是访问控制数据 - 可能实际上与 SMI 表 sysmaster:sysactptnhdr 的 nrows 列中的数据相同。

因此,催生新流程显然并不是成功的秘诀。您必须将查询结果从生成的进程传输到原始进程。正如我所说,具有单独显示和数据库访问线程的多线程解决方案可以以某种方式工作,但使用 I4GL 执行此操作存在问题,因为它不支持线程。您仍然需要决定客户端代码如何存储用于显示的信息。

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

在查询结束之前开始查看查询结果 的相关文章

  • MySQL 概念:会话与连接

    我对 MySQL 的概念有点困惑 会话与连接 当谈论连接到 MySQL 时 我们使用连接术语 连接池等 然而在 MySQL 在线文档中 http dev mysql com doc refman 4 1 en server system v
  • 无法连接到 MAMP 上的 phpMyAdmin

    我收到此错误消息 MySQL 说道 无法连接 设置无效 phpMyAdmin 尝试连接 MySQL 服务器 但服务器拒绝连接 您应该检查配置中的主机 用户名和密码 并确保它们与 MySQL 服务器管理员提供的信息相对应 用户和通行证是默认的
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • MySQL中查找id最大的行

    看一下下面名为 Articles 的 MySQL 表 id articleId version title content 1 1 0 0 ArticleNo 1 title v0 0 ArticleNo 1 content v0 0 2
  • 防止 Propel 插入空字符串

    当未设置列时 如何防止 Propel ORM 插入空字符串 CREATE TABLE user uid INTEGER PRIMARY KEY AUTO INCREMENT email VARCHAR 255 NOT NULL UNIQUE
  • 我在 MacBook M1 max 中的 nodejs 连接到数据库 oracle 时遇到问题帮助我

    Node js 中的错误消息 nodemon 启动node server js错误 错误 DPI 1047 无法找到 64 位 Oracle 客户端库 dlopen Users pitidev ldb Downloads instantcl
  • mysql 如何将 varchar(10) 转换为 TIMESTAMP?

    我已将所有日期存储到数据库中varchar 10 现在我想将它们转换为 TIMESTAMP 当我运行sql时 ALTER TABLE demo3 CHANGE date date TIMESTAMP NOT NULL 它提醒 1292 In
  • MySQL InnoDB 约束不起作用

    我偶然发现 innoDB 约束的奇怪行为 但找不到原因 我有包含数据的表格 下面列出了它们的结构 CREATE TABLE contents id int 10 unsigned NOT NULL AUTO INCREMENT title
  • CakePHP 查找 - 按字符串到整数排序?

    我想使用 CakePHP 从数据库中提取照片数组 按照片标题排序 0 1 2 3 我的查询当前看起来像 ss photos this gt Asset gt find all array conditions gt array kind g
  • 随着时间的推移累积(不重叠)——技术?

    我正在尝试找到一种更好的方法来制作水晶报告 其他人的 按组添加不重叠的时间 这显然是一个古老的问题 有没有一种技术可以得到 调整每条记录的 开始 结束 时间 以消除共同 重叠时间 亚组内 使用直接 SQL 尽管我发现我可以执行 CTE 假设
  • MySQL:@@ 是什么意思?

    我正在阅读本页上的 MySQL 文档 http dev mysql com doc refman 5 1 en set statement html http dev mysql com doc refman 5 1 en set stat
  • 拥有更多列或更多行会更高效吗?

    我目前正在重新设计一个可能包含大量数据的数据库 我可以选择在数据库中包含许多不同的列或使用大量行 如果我在下面做一些大纲 可能会更容易 item id user id title description content category t
  • 使用 DISTINCT 进行查询需要很长时间

    我正在使用 Microsoft Access 2003 我的项目中的一个表单需要很长时间才能向用户显示 这是适用的查询 SELECT DISTINCT tb KonzeptDaten DFCC tb KonzeptDaten OBD Cod
  • 来自数据库的 jfreechart 散点图

    如何使用java中的jfreechart绘制mysql数据库表中数据的散点图 我使用过 Swing 库 任何链接都会有帮助 我搜索了谷歌但找不到理解的解决方案 如果您有代码 请提供给我 实际上我确实做了条形图并使用 jfreechart 绘
  • 如何在oracle中将日期转换为时间戳(DD-MON-YYYY HH24:MI:SS.FF格式)?

    我尝试了下面的查询 但它不起作用 select TO TIMESTAMP ColumnName Data type Date DD MON YYYYHH24 MI SS FF from TableName where Changedate
  • hive - 在值范围之间将一行拆分为多行

    我在下面有一张表 想按从开始列到结束列的范围拆分行 即 id 和 value 应该对开始和结束之间的每个值重复 包括两者 id value start end 1 5 1 4 2 8 5 9 所需输出 id value current
  • 默认情况下在sql日期时间列中插入null/空值

    如何在 SQL Server 中创建一个表 默认日期时间为空 而不是1900 01 01 00 00 00 000我得到了 我的意思是 如果没有插入值 则默认值应该为 null 空等 如果没有插入值 默认值应该是null empty 在表定
  • Oracle REGEXP_INSTR() 和“a-z”字符范围与预期不匹配

    我想用REGEXP INSTR 在 oracle 数据库中检查小写 大写字符 我知道 upper and lower POSIX 字符类 但我选择了a z这给了我非常奇怪的结果 我不明白 有人可以解释一下吗 SELECT REGEXP IN
  • 为什么 ISNUMERIC('.') 返回 1?

    最近我在 SQL Server 中使用 ISNUMERIC 时遇到了一个问题 导致找到了这段代码 SELECT ISNUMERIC 这会返回 1 如 true 所示 难道不应该像 false 一样返回 0 吗 See Numeric 损坏了
  • 迭代 pandas 数据框的最快方法?

    如何运行数据框并仅返回满足特定条件的行 必须在之前的行和列上测试此条件 例如 1 2 3 4 1 1 1999 4 2 4 5 1 2 1999 5 2 3 3 1 3 1999 5 2 3 8 1 4 1999 6 4 2 6 1 5 1

随机推荐

  • 如何将多个 JSON 字符串合并为一个 ( Java )

    我尝试寻找一个可以使用的JAVA库 但没有成功 是否有一个 gson jackson groovy 库可以用来将多个 JSON 字符串组合或合并到一个有效负载中 例子 JSON 负载 A B 和 C 我希望将 B 和 C 添加 合并到 A
  • 组织原型 javascript,同时保留对象引用和继承

    我使用 JavaScript 原型和继承构建了一个大型应用程序 但我很难组织我的代码 例如 我有一个类轮播 它有很多这样的功能 Carousel prototype next function Carousel prototype prev
  • JSON.NET 反序列化 - 单个结果与数组

    我在尝试确定如何使我的序列化能够正确访问单个结果以及数组时遇到困难 当我进行 REST 调用在服务器上查找某些内容时 有时它会返回模型数组 但如果搜索结果只有一个模型 则不会作为错误返回 这是当我收到无法反序列化的异常时 因为对象属性需要一
  • char 类型乘以另一个 char

    C C 中两个字符相乘的结果是什么类型 unsigned char a 70 unsigned char b 58 cout lt lt a b lt lt endl prints 4060 means no overflow cout l
  • 查找字符串中重复字符的最长子串

    这是基础这个代码强制问题 我尽量不寻求有关 codeforces 问题的帮助 除非我真的真的陷入困境 而现在恰好就是这样 Your first mission is to find the password of the Martian d
  • glCopyTexImage2D 作为 glReadPixels (OpenGL ES) 的替代品

    我目前正在使用 OpenGL ES 游戏的屏幕截图glReadPixels 屏幕截图很棒 但是调用glReadPixels导致游戏中出现轻微卡顿 glCopyTexImage2D已被建议作为更有效的替代品glReadPixels 如何glC
  • 如何获取QTableView右键索引

    下面的代码创建一个带有QTableView看法 左键单击onLeftClick函数获取 QModelIndexindex 该 QModelIndex 稍后用于打印左键单击单元格的行号和列号 如何获得QModelIndex右键单击的单元格的索
  • ffmpeg:编辑元数据并自动增加其名称+根据“名称”设置“标题”的值

    此 PowerShell 代码分割了一个大的音频文件 sound1 在 5 分钟内将它们保存为sound100 1 mp3 sound1 002 mp3 ffmpeg i file name complete f segment segme
  • 从 Bool 数组返回索引值数组,其中 true

    任何人都知道一种从值为 true 的布尔数组返回索引值数组的优雅方法 例如 let boolArray true true false true 这应该返回 0 1 3 let boolArray true true false true
  • 带图像的 Foreach 循环

    我有一个 80 PNG 图像序列 我试图在其中为我的 Windows 应用程序创建动画 文件路径是 Assets Star 我试图弄清楚如何为文件夹中的每个图像创建 foreach 循环 因此它将图像对象设置为 Image1 然后在计时器经
  • 为什么我的 div 的边距会受到其内部内容/块的影响?

    我有以下内容 div p some content p div or div some content div 没有 p some content p div的定位不同 看起来 div 内的块内容正在影响 div 的外 顶部 边距 那么di
  • 将 Pandas 数据框放入现有 Excel 工作表

    有没有办法将数据框放入现有的 Excel 工作表中 我有一个数据框 需要将其复制到特定的 Excel 工作表中的特定位置 单元格 A2 这样它将镜像 粘贴 整个数据框 从选定的单元格 如图所示 开始 包括下面的单元格 这样我就不必一一为特定
  • 哪里可以获得 Eclipse 的 ADT 18?

    我的 eclipse 将 ADT 更新为 20 我认为这很糟糕 我想恢复到 18 但找不到从哪里下载 In here https dl ssl google com android eclipse 它仅提供版本 20 Thanks 下载此文
  • 使用 CSS,如何创建*粗*超过 1 像素的文本描边轮廓?

    下面是我用来制作 1px 文本描边轮廓的代码 但是如何使轮廓变粗呢 如果我只是将所有 1px 替换为 5px 结果看起来很疯狂 HTML div class element Hello div CSS element color white
  • 如何利用HTTP header XSS漏洞?

    假设一个页面只是打印 HTTP referer 标头的值 没有转义 因此 该页面容易受到 XSS 攻击 即攻击者可以使用包含类似内容的引用标头来制作 GET 请求 但如何才能真正使用它来攻击目标呢 攻击者如何使用该特定标头向目标发出特定请求
  • 为类型别名元组添加 Impl (f64, f64)

    我有一个自定义类型 Point type Point f64 f64 我想添加两个Point在一起 但我收到此错误 error E0368 binary assignment operation cannot be applied to t
  • 后续:从 lme4 中的 VarCorr 对象中提取名称并将其粘贴为列名称

    我正在跟进这个很好的答案 功能foo下面 取Name的列VarCorr fit 输出并使它们成为列名summary rePCA fit call 当我们输入时效果很好fm1 fm2 但我想知道为什么它失败了fm3 有解决办法吗 librar
  • 我有 recyclerview 和 searchview 如何发送有关我搜索的项目的详细信息数据

    我有带有 searchview 的 recyclerview 并且在 recyclerview 中选择项目时发送详细数据 问题是当我搜索项目并选择它时 详细信息数据不会更改总是出现第一个项目的详细信息数据 我如何发送有关我搜索的项目的详细数
  • 如何使实体只读?

    使用 JPA 使实体只读的正确方法是什么 我希望我的数据库表永远不会以编程方式修改 我想我明白我应该用以下方式锁定我的对象LockModeType READ 是否可以使用注释使我的实体在从数据库检索后直接锁定 或者我是否必须为该特定实体搞乱
  • 在查询结束之前开始查看查询结果

    假设我查询一个包含 500K 行的表 我想开始查看获取缓冲区中保存结果集的任何行 即使查询尚未完成 我想滚动浏览提取缓冲区 如果我滚动得太远 我想显示一条消息 例如 到达获取缓冲区的最后一行 查询尚未完成 当查询继续构建结果集时 可以使用