假设以下查询:
SELECT * FROM table;
DBMS会在获取第一行后立即给我第一行,还是先获取所有行(将它们保存在某种缓冲区中)然后立即给我所有行?
如果我的问题不明确。假设table
中的行数使得DBMS将花费60分钟来获取所有行。 DBMS会在60分钟内逐步返回行,还是我必须等待60分钟才能收到任何数据?
答案 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链接)。我可以假设它会尝试默认优化吞吐量。