Поддерживает ли SQL Server физическую сборку полного набора результатов?

Представьте, что у меня большая таблица с 20 столбцами и миллиардами строк данных. Затем я запускаю простой запрос:

select [First Name], [Last Name] from Audience; 

После этого я последовательно читал результирующий набор. Будет ли SQL Server физически создавать все записи (т.е. миллиарды записей) на стороне сервера в результирующем наборе до того, как я начну его читать? Есть ли какой-либо план запроса, который будет динамически строить результирующий набор при подаче его клиенту?

Я понимаю, что причины параллелизма могут помешать этому. Могу ли я дать какой-либо намек на то, что многопользовательский доступ невозможен? Может быть, я должен использовать курсоры?

Зависит от плана запроса. Если запрос не требует временных внутренних структур, тогда да, вы получите немедленный ответ даже до того, как будет создан полный набор записей. Если для запроса требуется временное внутреннее хранилище (например, вы сортируете его таким образом, который не соответствует индексу, или индекс доступен, но используется другой, поскольку он требует меньше ввода-вывода), тогда вам придется подождать пока не будет создан полный набор записей.

Единственный способ рассказать – посмотреть на план запроса и изучить каждый шаг. Вам нужно будет знать, как их интерпретировать … например, DISTINCT потребует временную структуру, тогда как FLOW DISTINCT не будет. Если в плане запроса отображается EAGER SPOOL вам обязательно придется подождать, хотя есть несколько вещей, которые вы можете сделать, чтобы их избежать.

Примечание. Вы не можете полагаться на это: планы запросов могут меняться в зависимости не только от схемы или индексов, но и от статистики базы данных (например, избирательности), которые всегда меняются.

Давайте будем гением компьютера.