Когда запрос SELECT начинает возвращать строки?

Предположим, что следующий запрос:

SELECT * FROM table;

Будет ли СУБД выдавать мне первую строку, как только она ее выберет, или она будет сначала извлекать все строки (сохранить их в каком-то буфере), а затем дать мне сразу все строки?

Если мой вопрос не ясен. Предположим, что количество строк в table таково, что СУБД займет ровно 60 минут, чтобы получить все строки. Будут ли СУБД последовательно возвращать строки через 60 минут, или мне придется подождать 60 минут, прежде чем получать какие-либо данные?

Ответ 1

В PostgreSQL сервер действительно будет возвращать строки клиенту, как только они будут доступны, если это выполнит план выполнения запроса. Это относится к вашему простому примеру. В других случаях, например, если у вас есть сортировка в конце, и вам придется дождаться, когда это закончится.

Но если вы используете стандартный интерфейс libpq, клиентская библиотека будет накапливать весь результат в памяти, прежде чем он вернет ее в клиентскую программу. Чтобы получить результаты по строкам, вам нужно использовать режим с одной строкой в libpq. Если вы используете другие интерфейсы или другие языки, результаты могут отличаться.

Ответ 2

Здесь нет жесткого правила. Но на практике механизм базы данных должен предпочесть возвращать строки, как только они будут доступны. Преимущество эффективности является большим и очевидным.

Обратите внимание, что это невозможно для всех запросов. Очень распространенным примером является предложение order by, которое не имеет индекса поддержки. Для сортировки база данных должна создать копию на стороне сервера отсортированной таблицы. Это означает, что он не может начать возвращать строки до завершения операции сортировки.

Ответ 3

Большинство, если не все, SQL-серверы не позволят вам просматривать любые строки, пока запрос не завершит поиск. Некоторые серверы предоставляют директиву FIRST ROWS (подсказку) для сервера, чтобы обеспечить первый набор строк раньше. См. Мой родственный вопрос SO и ответы для получения дополнительной информации по этому вопросу.

Ответ 4

Это зависит.

Например, база данных Oracle будет оптимизирована для пропускной способности по умолчанию и попытается вернуть все строки, или вы можете дать оптимизатору указание вернуть первые n строк с помощью `/* + FIRST_ROWS (n) */подсказка оптимизатора.

Что касается PostgresSQL, у него нет подсказок optmizer (см. эти два). Я могу предположить, что он попытается оптимизировать пропускную способность по умолчанию.