是否需要 SQL 的内置多线程功能? [关闭]

Posted

技术标签:

【中文标题】是否需要 SQL 的内置多线程功能? [关闭]【英文标题】:Would a built-in multi-threading capability for SQL be desireable? [closed] 【发布时间】:2010-06-20 01:52:08 【问题描述】:

例如:当查询尚未完成对表的搜索时,是否能够在查询返回时开始显示或操作行?我并不是说使用FIRST ROWS 指令来提示引擎,我的意思是透明的,无需添加额外的逻辑。这样的功能对于需要很长时间才能完成的查询很有用。

【问题讨论】:

我认为没有任何理由认为 SQL 还不是多线程的。 Continuation - Viewing FIRST_ROWS before query completes.的可能重复 【参考方案1】:

如果您考虑一下,这仅适用于没有 ORDER BY 或 GROUP BY 指令的查询。您所要求的似乎类似于“转储”的工作方式,它在完成读取表之前开始写入文件。您可以在完成转储之前开始读取文件并处理数据。

一些数据库支持缓冲和非缓冲查询处理,这部分是您正在寻找的。​​p>

【讨论】:

【参考方案2】:

SQL 是一种关系代数,旨在对集合(而不是子集)进行操作,在我看来,如果修改为允许这样做,将不会获得任何收益。

如果您需要此功能,很容易对数据库进行两次往返,第一次使用 fetch first 100 rows only 并快速显示它,第二次没有,以检索整个集合。

没有什么可以阻止实现(例如 DB2)快速返回第一行 N 行,同时它仍在向下传输其余行。

【讨论】:

“没有什么可以阻止...” SQL 的性质可能会阻止这种情况;例如当该排序需要数据库引擎对结果集进行排序时,ORDERED BY 的存在。 我更多地考虑了 DB 驱动程序(如 JDBC 客户端)将集合的第一部分传递给应用程序,同时仍然通过网络发送集合。这将是 DBMS 完全形成(并排序)集合之后。显然,在数据排序之前,您无法开始传递数据。 我说的是在查询完成执行之前开始将查询返回的行显示/操作到当前列表中,无论是全表扫描还是完成排序,就像看-ahead 缓冲区。 @Frank,你不能返回一个有序集,直到它被排序,并且在你拥有所有数据之前不能被排序。如果该集合未排序,或者您使用的索引可以保证按顺序交付(例如使用包含 order by X 的查询的列 X 上的索引),这可能是可行的。但在野外很少有未排序的查询。【参考方案3】:

您知道像 Oracle 这样的大型数据库还没有这样做吗?你做了一些从 blah 中选择 * 的代码并开始将结果流式传输到你的客户端,你知道 Oracle 在开始发送第一个字节之前已经 100% 计算并加载到内存中的查询吗?

(我也不知道,但如果这是真的,至少在某些情况下,我不会感到惊讶)

【讨论】:

如果他知道那会很快。 Oracle 流、SQL 服务器流。

以上是关于是否需要 SQL 的内置多线程功能? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程程序设计初步入门

写出java多线程程序设计中常用类及方法名,并分别说明它们的作用。

实验二:多线程

Python 多进程多线程效率比较

十多线程控制类

线程概念及多线程控制