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

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

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

  • SQL 更新 - 更新选定的行

    我正在使用 SQL Server 2008 我有一个名为MYTABLE有两列 ID STATUS 我想编写一个存储过程来返回其记录STATUS是 0 但是这个存储过程必须更新STATUS返回行数为 1 如何在单个查询中执行此选择和更新操作
  • 是否可以引用同一个表中的不同列?

    如果博客有一个 类别 表 如下所示 CREATE TABLE categories id INTEGER PRIMARY KEY AUTO INCREMENT parent id INTEGER NOT NULL name VARCHAR
  • 在 C# 中读取/写入大型 XML 文件

    我正在开发一个带有 XML 数据库的应用程序 我有很大的 XML 文件 我必须在其中读取和写入数据 问题是我不想将整个 XML 文件加载到内存中 也不想因为性能问题而循环遍历整个文件 因为如果我将整个文件加载到内存中 这将影响应用程序性能
  • 在 sqlplus 中执行 plsql 时将错误消息重定向到日志文件

    在 sqlplus 中执行 PL SQL 程序时 需要一种将 PL SQL 程序错误消息重定向到日志文件的方法 假设 PL SQL 程序名为send 2012 sql它有以下异常块 EXCEPTION WHEN NO DATA FOUND
  • 如何在 MySQL 查询本身中检索 JSON 数组中存储的值?

    我有下表 product id product name image path misc 1 flex http firstpl course level id 19 group id 40067 2 Android http firstp
  • SQL 按 IN 子句中的元素排序

    我有一个ITEM表 我想返回按 IN 子句中通知的相同顺序排序的结果 这些 ID 由用户告知 今天我有这个 SELECT FROM ITEM WHERE ITEM ID IN 45 2 671 6 ORDER BY CASE ITEM ID
  • 加载“mysql2”Active Record 适配器时出错

    我正在尝试升级我的应用程序 这是我在部署应用程序时遇到的错误 加载 mysql2 Active Record 适配器时出错 缺少它所依赖的宝石 无法激活mysql2 0 4 4 已经激活mysql2 0 3 21 确保所有依赖项都添加到 G
  • SQL Server:应用正则表达式替换

    这是我的 SQL 查询 select codi nivell from anc documents 示例数据是 06080100000000 06080100000000 06080100000000 06080100000000 0608
  • 使用默认路径中的文件创建数据库

    我想创建一个创建数据库的 SQL 脚本 现在 我有这个 CREATE DATABASE Documents ON PRIMARY NAME N Documents FILENAME N Documents mdf LOG ON NAME N
  • 使用外键将表拆分为两个表

    我有一张桌子 drupal comments 其中包括以下列 cid primary key uid foreign key to users table optional name varchar optional email varch
  • 如何将逗号分隔的列值与另一个表作为行连接

    我试图通过首先转换我正在成功执行的 SupplierId 列中的逗号分隔值来连接两个表 然而 当我尝试通过外键 DCLink 加入另一个带有供应商名称的表 Vendors 时 问题就出现了 这就是我的意思 原始表的 select 语句 SE
  • 为 WPF DataGrid 行一一着色

    我正在制作一个 WPF 程序 它能够为 a 中的行着色DataGrid一个接一个地使用红色for循环 我遇到了一些奇怪的事情 如果DataGrid数据库表中有 40 多行数据 它不会对所有行进行着色 这是我正在使用的代码 private v
  • JavaPreparedStatementUTF-8字符问题

    我有一份准备好的声明 PreparedStatement st 在我的代码中 我尝试使用 st setString 方法 st setString 1 userName userName 的值为 ak a setString 方法将 ak
  • 在查询中创建临时变量

    我希望能够在查询中创建一个临时变量 而不是存储过程或函数 它不需要声明和设置 这样我在调用它时就不需要传递查询参数 正在努力朝这个方向努力 Select field1 tempvariable 2 2 newlycreatedfield t
  • 如何使用单个查询对从另一个表检索的表列表进行 UNION?

    我有一个表 其中包含 PostgreSQL 中的表列表 id table 1 table1 2 table2 3 table3 我想从所有这些表的联合中进行选择 例如 伪代码 select from union select table f
  • Mysql:将数据库从本地时间转换为UTC

    我需要从本地时间 ut UTC 转换现有的 日期时间字段 数据库 这些值和日期时间存储在时区为 CET 1 夏令时 2 的服务器上 选择我使用的数据时UNIX TIMESTAMP 它神奇地补偿了一切 即时区偏移和夏令时 如果我正确阅读了文档
  • Web SQL 数据库 + Javascript 循环

    我正在尝试解决这个问题 但我自己似乎无法解决 我正在使用 Web SQL DB 但无法让循环正常使用它 I use for var i 0 i lt numberofArticles 1 i db transaction function
  • 如何创建从表中最大值开始的 Oracle 序列?

    尝试在 Oracle 中创建一个以特定表中的最大值开始的序列 为什么这不起作用 CREATE SEQUENCE transaction sequence MINVALUE 0 START WITH SELECT MAX trans seq
  • 从 SQL 语句中检索元数据(表名)

    我使用的是 Visual Studio 2008 我创建了一个 Winforms 应用程序 并且尝试从 SQL 语句中提取表名 con new SqlConnection connString String queryString Sele
  • 发布Oracle和SQL Server性能测试是否违反许可? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想对Oracle和SQL Server中的空间索引进行性能测试 我想将其纳入我的理学硕士工作中 发布此类结果是否违反 dbms 的许可 也许有人已经

随机推荐

  • 如何将多个 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 行的表 我想开始查看获取缓冲区中保存结果集的任何行 即使查询尚未完成 我想滚动浏览提取缓冲区 如果我滚动得太远 我想显示一条消息 例如 到达获取缓冲区的最后一行 查询尚未完成 当查询继续构建结果集时 可以使用