10

假设以下查询:

SELECT * FROM table;

DBMS 会在获取第一行后立即给我第一行,还是首先获取所有行(将它们保存在某种缓冲区中)然后一次给我所有行?

如果我的问题不清楚。假设 中的行table数使得 DBMS 将花费 60 分钟来获取所有行。DBMS 会在 60 分钟内逐步返回行,还是我必须等待 60 分钟才能收到任何数据?

4

4 回答 4

8

在 PostgreSQL 中,如果查询执行计划允许,服务器确实会在行可用时立即将它们返回给客户端。在您的简单示例中就是这种情况。在其他情况下,例如,如果您最后可能有一个排序,并且必须等待它完成。

但是如果您使用标准的 libpq 接口,客户端库将在内存中构建整个结果,然后再将其返回给客户端程序。要逐行获取结果,需要在 libpq中使用单行模式。如果您使用其他界面或其他语言,结果可能会有所不同。

于 2013-08-04T20:47:01.353 回答
3

这里没有硬性规定。但在实践中,数据库引擎应该更愿意在行可用时立即返回。效率优势大而明显。

请注意,这不适用于所有查询。一个非常常见的示例是order by没有支持索引的子句。为了排序,数据库必须创建已排序表的服务器端副本。这意味着在排序操作完成之前它不能开始返回行。

于 2013-08-04T17:53:48.537 回答
1

大多数(如果不是全部)基于 SQL 的服务器在查询完成搜索之前不允许您查看任何行。一些服务器提供了 FIRST ROWS 指令(提示),以便服务器更快地提供第一组行。有关此主题的更多信息,请参阅我的相关SO 问题和答案

于 2013-08-04T20:58:48.047 回答
0

这取决于。

例如,Oracle 数据库将默认优化吞吐量并尝试返回所有行,或者您可以使用`/*+ FIRST_ROWS(n) */优化器提示指示优化器返回前n行。

至于 PostgresSQL,它没有优化器提示(请参阅 两个链接)。我可以假设默认情况下它会尝试优化吞吐量。

于 2013-08-04T17:50:06.413 回答