sql 结果存储在 gui 客户端中的什么位置?

Where are sql results stored in a gui client?

假设我有一个包含 100B 行的数据集,并且我从 table 中无限制地执行了 SELECT * sql 查询,假设客户端没有强加限制在它之上 --

由于数据是 运行,它通常会将结果逐渐加载到界面中。但是,数据集太大,无法安装到我的本地机器上。当它是“运行 query...”时实际发生了什么?数据是否直接加载到程序存储器?数据是否保存到类似内存映射的 tmp 文件(我认为不是),或者 'display' 此处结果的最常见方式是什么?最后,一旦超过我的本地内存限制会发生什么——程序会挂起还是崩溃?

我知道这是一个稍微抽象的问题,但我主要是想问 SQL 结果集通常是如何 'loaded' 以便在用户界面中向用户显示结果.

。可能没有“通常”的答案。不同的应用程序可能会根据他们想要制作的 trade-offs 采用不同的方法。

最简单的方法是客户端获取前 N 行(您将此标记为 Oracle SQL Developer,其中默认 N 为 50)。如果您随后在结果中向下滚动,客户端将获取接下来的 N 行。客户端将已经获取的结果保存在内存中。如果您尝试获取比客户端机器可用内存更多的数据(当然,客户端可能已配置为具有比可用物理内存更大的虚拟内存),应用程序要么崩溃,要么产生某种错误。请注意,根据具体实现,数据可以通过 ODBC/JDBC/etc 缓存。驱动程序或实际应用程序代码。

如果客户端出于某种原因期望向人类显示数 GB 的数据是有益的(或者如果崩溃或出错特别成问题),则客户端可能会将结果写入文件而不是而不是将它们保存在内存中。这在 GUI 中似乎并不常见 IDE 但我并没有使用大量不同的 GUI。

其他选项也是可能的(但可能不值得在应该向不打算滚动浏览数十亿个结果的人提供结果的应用程序中实施)。在幕后,应用程序或驱动程序可以为先前返回的数据而不是整行缓存一个键(在 Oracle 中,通常是 ROWID),然后 re-fetch 如果用户试图向回滚动该数据到顶部。如果您尝试从第 10 亿行回滚到第 1 行,应用程序可能会丢弃您已经获取的数据并抛出错误。或者如果您想返回到第一行,它可以静默 re-execute 查询。