SELECT查询何时开始返回行?

时间:2013-08-04 17:45:33

标签: sql postgresql select

假设以下查询:

SELECT * FROM table;

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

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

4 个答案:

答案 0 :(得分:8)

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

但是如果你使用标准的libpq接口,客户端库会在将它返回到客户端程序之前在内存中构建整个结果。要逐行获取结果,您需要在libpq中使用single-row mode。如果您使用其他界面或其他语言,结果可能会有所不同。

答案 1 :(得分:3)

这里没有严格的规定。但实际上,数据库引擎应该更喜欢在行可用时立即返回。效率优势是显而易见的。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

取决于。

例如,Oracle数据库默认情况下会针对吞吐量进行优化并尝试返回所有行,或者您可以指示优化器使用`/ * + FIRST_ROWS返回第一个 n 行( n)* / optimizer hint

对于PostgresSQL,它没有optmizer提示(请参阅these two链接)。我可以假设它会尝试默认优化吞吐量。